Laravel4のcomposer installでエラーになる場合

laravel4のインストールでは php composer を利用しますが、仮想環境などのパフォーマンスが良くない環境で行うとエラーになることがありました。

$ composer install

Loading composer repositories with package information Installing dependencies (including require-dev)
- Installing symfony/translation (v2.3.2) Downloading: 100% ....

Generating optimized class loader
[Symfony\Component\Process\Exception\RuntimeException]
The process timed-out.
optimize
Script php artisan optimize handling the post-install-cmd event returned with an error

こんな感じで、どうも php artisan optimize の実行でタイムアウトのエラーが出ています。

composer.jsonを見てみると、composer の install、updateで optimize が実行されている模様です。

        "scripts": {
                "post-install-cmd": [
                        "php artisan optimize"
                ],
                "pre-update-cmd": [
                        "php artisan clear-compiled"
                ],
                "post-update-cmd": [
                        "php artisan optimize"
                ],

optimize が何をしているのか詳しく把握していませんが、エラーでぐぐっているとこんなissueを発見しました。

PHP Artisan Optimize - Timed out? · Issue #1050 · laravel/framework · GitHub

optimizeで使用している vendor/symfony/process/Symfony/Component/Process/Process.php のプログラムが、実行時間が60秒を超えるとタイムアウトしてしまうみたいです。

__construct で、$timeout = 60 と指定されている部分を、$timeout = 0(無制限) にして、php artisan optimize してみると正常に終了するようになりました。90秒くらいかかっている感じです。

ちょっと困った事になってしまいましたが、optimize は composer.json から実行されているので、composer.json の scripts で、optimizeの前後に timeout の値を置換する処理を入れて暫定的に対応しました。

        "scripts": {
                "post-install-cmd": [
                        "perl -pi -e 's/timeout = 60/timeout = 0/' vendor/symfony/process/Symfony/Component/Process/Process.php",
                        "php artisan optimize",
                        "perl -pi -e 's/timeout = 0/timeout = 60/' vendor/symfony/process/Symfony/Component/Process/Process.php"
                ],
                "pre-update-cmd": [
                        "php artisan clear-compiled"
                ],
                "post-update-cmd": [
                        "perl -pi -e 's/timeout = 60/timeout = 0/' vendor/symfony/process/Symfony/Component/Process/Process.php",
                        "php artisan optimize",
                        "perl -pi -e 's/timeout = 0/timeout = 60/' vendor/symfony/process/Symfony/Component/Process/Process.php"
                ],
                "post-create-project-cmd": [
                        "php artisan key:generate"
                ]
        },