Laravel应用程序的部署会中断应用程序,直到手动运行composer安装



我有一个使用Passport的Laravel应用程序来提供API身份验证。该应用程序是使用git和post-rereceive挂钩进行部署的。接收后脚本的一部分是composer安装。自从我加入Passport以来,每当我部署我的应用程序时,API都会在身份验证门后面的路由上中断,堆栈跟踪粘贴在下面。

当我进入应用程序的服务器并运行与接收后挂钩中完全相同的composer install命令时,一切都会恢复正常。

当部署发生时,我没有看到来自git的任何错误消息,而且当部署发生和手动运行命令时,我似乎从composer install得到了相同的输出。

以下是composer install命令的部署输出:

remote: Loading composer repositories with package information        
remote: Installing dependencies (including require-dev) from lock file        
remote: Nothing to install or update        
remote: Generating autoload files        
remote: > php artisan clear-compiled        
remote: The compiled class file has been removed.        
remote: > php artisan optimize        
remote: Generating optimized class loader        
remote: Compiling common classes

当我手动运行命令时,我看到的是:

Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Nothing to install or update
Generating autoload files
> php artisan clear-compiled
The compiled class file has been removed.
> php artisan optimize
Generating optimized class loader
Compiling common classes

这是怎么回事?部署似乎是在安装Passport的某个组件的旧版本,然后在手动运行composer install后进行更正,但我不知道为什么会发生这种情况,尤其是为什么每次部署新更新时都会发生,即使composer.json或composer.lock没有更改。

这是上面提到的堆栈跟踪:

[2017-01-04 20:36:37] production.ERROR: exception 'BadMethodCallException' with message 'Call to undefined method IlluminateDatabaseQueryBuilder::withAccessToken()' in /home/portalvarius/app/production/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php:2450
Stack trace:
#0 [internal function]: IlluminateDatabaseQueryBuilder->__call('withAccessToken', Array)
#1 [internal function]: IlluminateDatabaseQueryBuilder->withAccessToken(Object(LaravelPassportToken))
#2 /home/portalvarius/app/production/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(1469): call_user_func_array(Array, Array)
#3 [internal function]: IlluminateDatabaseEloquentBuilder->__call('withAccessToken', Array)
#4 [internal function]: IlluminateDatabaseEloquentBuilder->withAccessToken(Object(LaravelPassportToken))
#5 /home/portalvarius/app/production/bootstrap/cache/compiled.php(11801): call_user_func_array(Array, Array)
#6 /home/portalvarius/app/production/vendor/laravel/passport/src/Guards/TokenGuard.php(139): IlluminateDatabaseEloquentModel->__call('withAccessToken', Array)
#7 /home/portalvarius/app/production/vendor/laravel/passport/src/Guards/TokenGuard.php(139): AppModelsUser->withAccessToken(Object(LaravelPassportToken))
#8 /home/portalvarius/app/production/vendor/laravel/passport/src/Guards/TokenGuard.php(90): LaravelPassportGuardsTokenGuard->authenticateViaBearerToken(Object(IlluminateHttpRequest))
#9 /home/portalvarius/app/production/vendor/laravel/passport/src/PassportServiceProvider.php(251): LaravelPassportGuardsTokenGuard->user(Object(IlluminateHttpRequest))
#10 [internal function]: LaravelPassportPassportServiceProvider->LaravelPassport{closure}(Object(IlluminateHttpRequest))
#11 /home/portalvarius/app/production/vendor/laravel/framework/src/Illuminate/Auth/RequestGuard.php(53): call_user_func(Object(Closure), Object(IlluminateHttpRequest))
#12 /home/portalvarius/app/production/bootstrap/cache/compiled.php(544): IlluminateAuthRequestGuard->user()
#13 /home/portalvarius/app/production/bootstrap/cache/compiled.php(548): IlluminateAuthRequestGuard->check()
#14 /home/portalvarius/app/production/app/Http/Middleware/Authenticate.php(20): IlluminateAuthRequestGuard->guest()
#15 /home/portalvarius/app/production/bootstrap/cache/compiled.php(10052): AppHttpMiddlewareAuthenticate->handle(Object(IlluminateHttpRequest), Object(Closure), 'api')
#16 /home/portalvarius/app/production/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(33): IlluminatePipelinePipeline->IlluminatePipeline{closure}(Object(IlluminateHttpRequest))
#17 /home/portalvarius/app/production/Api/V1/Http/Middleware/LogApiAccess.php(37): IlluminateRoutingPipeline->IlluminateRouting{closure}(Object(IlluminateHttpRequest))
#18 /home/portalvarius/app/production/bootstrap/cache/compiled.php(10052): ApiV1HttpMiddlewareLogApiAccess->handle(Object(IlluminateHttpRequest), Object(Closure))
#19 /home/portalvarius/app/production/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(33): IlluminatePipelinePipeline->IlluminatePipeline{closure}(Object(IlluminateHttpRequest))
#20 /home/portalvarius/app/production/bootstrap/cache/compiled.php(10160): IlluminateRoutingPipeline->IlluminateRouting{closure}(Object(IlluminateHttpRequest))
#21 /home/portalvarius/app/production/bootstrap/cache/compiled.php(10052): IlluminateRoutingMiddlewareSubstituteBindings->handle(Object(IlluminateHttpRequest), Object(Closure))
#22 /home/portalvarius/app/production/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(33): IlluminatePipelinePipeline->IlluminatePipeline{closure}(Object(IlluminateHttpRequest))
#23 /home/portalvarius/app/production/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(49): IlluminateRoutingPipeline->IlluminateRouting{closure}(Object(IlluminateHttpRequest))
#24 /home/portalvarius/app/production/bootstrap/cache/compiled.php(10052): IlluminateRoutingMiddlewareThrottleRequests->handle(Object(IlluminateHttpRequest), Object(Closure), '60', '1')
#25 /home/portalvarius/app/production/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(33): IlluminatePipelinePipeline->IlluminatePipeline{closure}(Object(IlluminateHttpRequest))
#26 /home/portalvarius/app/production/bootstrap/cache/compiled.php(10037): IlluminateRoutingPipeline->IlluminateRouting{closure}(Object(IlluminateHttpRequest))
#27 /home/portalvarius/app/production/bootstrap/cache/compiled.php(8339): IlluminatePipelinePipeline->then(Object(Closure))
#28 /home/portalvarius/app/production/bootstrap/cache/compiled.php(8330): IlluminateRoutingRouter->runRouteWithinStack(Object(IlluminateRoutingRoute), Object(IlluminateHttpRequest))
#29 /home/portalvarius/app/production/bootstrap/cache/compiled.php(8321): IlluminateRoutingRouter->dispatchToRoute(Object(IlluminateHttpRequest))
#30 /home/portalvarius/app/production/bootstrap/cache/compiled.php(2575): IlluminateRoutingRouter->dispatch(Object(IlluminateHttpRequest))
#31 /home/portalvarius/app/production/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): IlluminateFoundationHttpKernel->IlluminateFoundationHttp{closure}(Object(IlluminateHttpRequest))
#32 /home/portalvarius/app/production/bootstrap/cache/compiled.php(3371): IlluminateRoutingPipeline->IlluminateRouting{closure}(Object(IlluminateHttpRequest))
#33 /home/portalvarius/app/production/bootstrap/cache/compiled.php(10052): IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode->handle(Object(IlluminateHttpRequest), Object(Closure))
#34 /home/portalvarius/app/production/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(33): IlluminatePipelinePipeline->IlluminatePipeline{closure}(Object(IlluminateHttpRequest))
#35 /home/portalvarius/app/production/bootstrap/cache/compiled.php(10037): IlluminateRoutingPipeline->IlluminateRouting{closure}(Object(IlluminateHttpRequest))
#36 /home/portalvarius/app/production/bootstrap/cache/compiled.php(2519): IlluminatePipelinePipeline->then(Object(Closure))
#37 /home/portalvarius/app/production/bootstrap/cache/compiled.php(2503): IlluminateFoundationHttpKernel->sendRequestThroughRouter(Object(IlluminateHttpRequest))
#38 /home/portalvarius/app/production/public/index.php(54): IlluminateFoundationHttpKernel->handle(Object(IlluminateHttpRequest))
#39 {main}        

好的,所以问题出在artisan optimize命令中。正如我在对我的问题的评论中所指出的,我注意到优化命令通过post-rereceive钩子运行的速度比手动运行该命令快得多。

在我的部署环境中,我在一个与基本laravel目录分离的目录中有一个composer.phar文件当我在基本目录中创建了一个到composer.phar的软链接时,一切都恢复了正常

我仍然不确定为什么会出现这个问题,但似乎Laravel在从后接收挂钩运行时可能找不到我的composer实例,尽管我的环境设置为从命令行运行相同的命令效果良好。

相关内容

最新更新