✍️

composer のスクリプトで phpstan を実行する時のタイムアウト定義について

2025/03/04に公開

私が関わっているプロジェクトでは、 laravel と phpstan を利用しています。
この phpstan の level を max にした時に軽くハマったので、同じような目に遭っている人の助けになればと思い、短いですが tips 的な記事を書きました。

なぜか phpstan.neon に定義している時間よりも早くタイムアウトする

今開発しているプロジェクトでは、 composer.json に以下のように設定しています

        "phpstan": [
            "phpstan analyze --memory-limit 2G -c phpstan.neon"
        ],

そして、 phpstan.neon は以下のようにしています

    parallel:
        processTimeout: 3600.0

このような状態なのですが、以下のようなエラーが出てしまいました
(300秒でタイムアウト???🤔)

The following exception is caused by a process timeout
Check https://getcomposer.org/doc/06-config.md#process-timeout for details

In Process.php line 1205:

  The process "phpstan analyze --memory-limit 2G -c phpstan.neon" exceeded the timeout of 300 seconds.

結論

composer は composer でタイムアウトの時間が定義されているので、 composer コマンドで phpstan を利用するなら process-timeout を記述すべき。

(今振り返るとログの Check https~ の箇所をよく読めば分かった事だった...)

どういうこと?

最初調査した時、 AI に聞いたら以下のような対応を紹介されました

サーバやローカル環境で php.ini が編集できるのであれば、以下のような設定を検討してください。

    ```
    ; PHPの実行時間上限を 600 秒にする
    max_execution_time = 600

    ; 使用メモリ上限を 2GB にする
    memory_limit = 2G
    ```

ただ、これでも結果が変わらず、どういうことなのかさっぱり分からず自分でググってみると以下の issue を見つけました

どうやら composer コマンドでスクリプトを実行する時のタイムアウトの定義は、 composer.json でおこなうべきのようですね👀

なので上記 issue を参考に composer.json に記述したところ、無事タイムアウトせずに phpstan を実行できました!

    "config": {
        "process-timeout": 3600
    },

まとめ

  • エラーはちゃんと読もう
  • タイムアウトの定義箇所が色々あるのはややこしい

Discussion