🗂

Composer Scriptsのphpと@phpの違い

2024/07/01に公開

はじめに

ComposerにはScriptsという機能を使って任意のコマンドを登録し実行することができる。

https://getcomposer.org/doc/articles/scripts.md

このScriptsにコマンドにphpスクリプトを登録する際にphp@phpのどちらを使えばいいのか迷ったので違いを調べてみた。

環境

  • PHP 8.3.8
  • Composer 2.7.7

サンプルコード

echo.php
<?php
echo 'サンプルPHPコマンド' . PHP_EOL;
composer.json
{
    "scripts": {
        "echo-php": "php echo.php",
        "echo-@php": "@php echo.php"
    }
}

phpを指定する場合

ターミナルからphpコマンドを実行するときと一緒です。

% php echo.php 
サンプルPHPコマンド
% composer echo-php
> php echo.php
サンプルPHPコマンド

つまり、phpコマンドのパスが通っていないと実行できないってことでいいはず。

@phpを指定する場合

Composerのドキュメントに書いてある@phpの説明

https://getcomposer.org/doc/articles/scripts.md#executing-php-scripts

To execute PHP scripts, you can use @php which will automatically resolve to whatever php process is currently being used:

google翻訳を使うと...

PHP スクリプトを実行するには、現在使用されている PHP プロセスを自動的に解決する @php を使用できます。

つまり、@phpを使う事で、phpコマンドのパスを自動で探し出して実行してくれるってことでいいのかな?

実際にそれらしいコードをみると...

https://github.com/composer/composer/blob/2.7.7/src/Composer/EventDispatcher/EventDispatcher.php#L450-L463

この2行でphpコマンドのパスを取得していることがわかる。
symfony/processの内容は今回はスルーします。

$finder = new PhpExecutableFinder();
$phpPath = $finder->find(false);

Composerのドキュメントをもう少しみると、次のようなことが書かれている。

You can also call a shell/bash script, which will have the path to the PHP executable available in it as a PHP_BINARY env var.

環境変数のPHP_BINARYの内容を見ているってことで、
PHPマニュアルにも、次のように書かれているから、@phpを指定すると、自動でphpコマンドのパスを取得して実行しているようですね。

スクリプト実行時の PHP バイナリのパス。

まとめ

どちらを指定しても、phpコマンドの実行は可能みたいです。
ただし、環境次第ではphpコマンドのパスが指定されていない場合もあるかもしれないので、その辺を考慮するなら@phpを使っておいた方がいいかもしれないですね。

Discussion