背景
最近迁移服务器,内网信息地址进行了更改,由于发布机仅作为拉取代码,打包作用,因此并未在发布机器上对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


