Laravel 5.2 artisan optimize - php_strip_whitespace无法打开流:没有子进程

8
自从从Laravel 5.1升级到5.2后,在CircleCI上运行PHP 5.6.14时,运行artisan optimize时出现了问题。
[ErrorException]                                                                                 
php_strip_whitespace(/var/laravel/project/root): failed to open stream: No child processes

其中/var/laravel/project/root是composer.json和vendor所在的目录。

这个命令在我运行PHP 5.6.11-1ubuntu3.1的开发环境中可以正常运行。我遵循了官方的5.1到5.2升级指南。

Exception trace:
() at /var/laravel/project/root/vendor/classpreloader/classpreloader/src/ClassPreloader.php:124
Illuminate\Foundation\Bootstrap\HandleExceptions->handleError() at n/a:n/a
php_strip_whitespace() at /var/laravel/project/root/vendor/classpreloader/classpreloader/src/ClassPreloader.php:124
ClassPreloader\ClassPreloader->getCode() at /var/laravel/project/root/vendor/laravel/framework/src/Illuminate/Foundation/Console/OptimizeCommand.php:83
Illuminate\Foundation\Console\OptimizeCommand->compileClasses() at /var/laravel/project/root/vendor/laravel/framework/src/Illuminate/Foundation/Console/OptimizeCommand.php:64
Illuminate\Foundation\Console\OptimizeCommand->fire() at n/a:n/a
call_user_func_array() at /var/laravel/project/root/bootstrap/cache/compiled.php:1217
Illuminate\Container\Container->call() at /var/laravel/project/root/vendor/laravel/framework/src/Illuminate/Console/Command.php:169
Illuminate\Console\Command->execute() at /var/laravel/project/root/vendor/symfony/console/Command/Command.php:256
Symfony\Component\Console\Command\Command->run() at /var/laravel/project/root/vendor/laravel/framework/src/Illuminate/Console/Command.php:155
Illuminate\Console\Command->run() at /var/laravel/project/root/vendor/symfony/console/Application.php:787
Symfony\Component\Console\Application->doRunCommand() at /var/laravel/project/root/vendor/symfony/console/Application.php:186
Symfony\Component\Console\Application->doRun() at /var/laravel/project/root/vendor/symfony/console/Application.php:117
Symfony\Component\Console\Application->run() at /var/laravel/project/root/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:107
Illuminate\Foundation\Console\Kernel->handle() at /var/laravel/project/root/artisan:36

有什么想法可以帮我解决这个问题吗?

错误似乎与类加载器/优化器尝试加载不存在的类/文件有关。请尝试检查您的config/app.php中是否添加了任何类。还可以尝试卸载composer自动加载。 - RCrowt
你解决了吗? - Nestor Mata Cuthbert
@RCrowt 我已经尝试使用 https://raw.githubusercontent.com/laravel/laravel/master/config/app.php 中的默认 config/app.php,但没有成功。是的,我已经尝试过 composer dump-autoload,但仍然没有成功。 - Dave Southey
@NestorMataCuthbert 暂时还没有呢。我目前想不出任何主意。 - Dave Southey
是的,我也是,我尝试了所有的方法,但是这个可怕的错误仍然存在,虽然网站似乎运行良好,但我想唯一的问题就是优化没有完成,现在只能这样了,我会继续寻找解决方案,如果我找到了,我会告诉你。 - Nestor Mata Cuthbert
2个回答

9
我在 https://laracasts.com/discuss/channels/laravel/laravel-optimize-error 找到了答案,其中johnwheal提到config/compile.php是错误的。
原来在2015年4月的一次提交中,config/compile.php中的文件数组被清空了,但我没有看到这个变化在升级指南中提到。后来这个变化被添加到了升级指南中。
要解决这个问题,可以选择以下两种方法之一:
  • 清空config/compile.php中的文件数组。

或者

  • config/compile.php中的文件数组中移除BusServiceProvider.phpConfigServiceProvider.php

已经有一个PR将其添加到文档中了。https://github.com/laravel/docs/pull/2056 - Dave Southey
我确认这解决了问题。 - Nestor Mata Cuthbert
不要清空文件数组。只需要删除其中缺少的两个提供程序所在的那一行即可。 - mniess
如果这是推荐的解决方案,为什么 Laravel 5.2 的默认设置是将数组保持为空?请参见 https://github.com/laravel/laravel/blob/master/config/compile.php @mniess - Dave Southey
@DaveSouthey 这是一个好问题。将提供程序放入其中应该明显地改善性能。 - mniess
@DaveSouthey 我不确定,但如果你阅读文档,它会说明:“如果存在,则从config/compile.php中的文件数组中删除以下行:”。请参见“升级到5.2.0从5.1”中的“编译类”。显然,他们的文档和源代码之间存在差异。 - Matt

0

这个错误的原因是在5.1到5.2的转换中,BusServiceProviderConfigServiceProvider已被移除。虽然提供的答案可以通过删除所有编译类来解决问题,但你只需要从config/compile.php中删除BusServiceProviderConfigServiceProvider这两个。

'files' => [ realpath(__DIR__.'/../app/Providers/AppServiceProvider.php'), realpath(__DIR__.'/../app/Providers/BusServiceProvider.php'), // 这个 realpath(__DIR__.'/../app/Providers/ConfigServiceProvider.php'), // 和这个 realpath(__DIR__.'/../app/Providers/EventServiceProvider.php'), realpath(__DIR__.'/../app/Providers/RouteServiceProvider.php'), ],


ConfigServiceProvider也已被移除。此外,Laravel 5.2的默认设置是将文件数组保持为空。请参见https://github.com/laravel/laravel/blob/master/config/compile.php。 - Dave Southey
@DaveSouthey同意(更新的答案),尽管您仍然可以通过保留其中剩余的项目来受益于编译:)。 Laravel已经更新了他们的升级文档,现在只提到删除上述两个项目。 - Matt
如果这是推荐的解决方案,为什么 Laravel 5.2 的默认设置是将数组保持为空?请参见 http://github.com/laravel/laravel/blob/master/config/compile.php。 - Dave Southey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接