背景
最近迁移服务器,内网信息地址进行了更改,由于发布机仅作为拉取代码,打包作用,因此并未在发布机器上对RMQ、以及部分对内服务地址进行解析,导致composer dump-autoload
的时候执行超时报错,返回了错误码 255。
Script @php artisan package:discover --ansi handling the post-autoload-dump event returned with error code 255
触发的场景
- 如
Laravel
的文档所说:Laravel
升级版本到6.x-7.x
,可能会导致该问题被触发!具体可以看这里Laravel 7.x
依赖了Symfony 5.x
的组件,在升级Laravel
的时候需要同步升级一下Symfony
的组件使用 - 单独执行
php artisan package:discover --ansi
没有问题,但是一旦配合composer
执行就触发,排查php
的error.log
寻找原因有一个脚本在析构函数中未经检查就尝试去获取RMQ的链接然后进行资源释放,由于发布机器没有绑定RMQ的内网地址,导致
composer autoload
的时候(该过程composer
会自动的new Class()
生成autoload
文件,因此触发了析构函数的链接)超时执行失败
综上:
- 代码里用了
vendor
里没有的类,此时可以检查一下执行composer
的php
版本是否不一致,从而导致加载的类库不同,导致类或函数调用丢失【例如:使用php7.x
执行正常,切换至php5.x
就不正常】 - 查看一下对应时间节点的
php_error.log
,是否有报错【例如:文件读写权限受限、链接资源超时、扩展没开之类…】
解决步骤
- 排除了执行
composer
时php
的版本差异 - 排除发布系统执行脚本超时断开链接导致:直接上发布机器跑一次
composer
命令 - 排除
php artisan
的问题:php artisan package:discover --ansi Rebuild the cached package manifest
手动执行一次,重新构建缓存扩展包,正常! - 排除
composer
版本问题:composer -V
对比了测试环境与发布机的版本,并执行composer selfupdate
将composer
升级到相同版本,问题依然存在! - 依次查看了
php
的日志信息,如:php_error.log
、php_slow.log
,查看相同时间节点日志信息,最终发现问题! - 解决问题:由于是废弃的脚步任务,直接删除了脚步上线!(断开资源的时候应当对资源进行检查再进行操作!)
总结
composer
在执行dump-autoload
生成classMap
文件的时候,会自动的new class()
- 可以在
composer.json
文件中配置composer
执行钩子事件,如:php artisan package:discover --ansi
会在composer dump-autoload
执行后被触发!
推荐阅读:https://segmentfault.com/a/1190000021476022