3

次のようないくつかのディレクトリでファイルを実行するスクリプトがあります。

exec("php-cli $file_path > /dev/null 2>/dev/null &"); //php command-line

これはほとんどのホストで機能しますが、一部のホストではこれが気に入らず、実行されず、エラーが発生しません。

これが失敗するホストの場合、私は使用します

exec("php $file_path > /dev/null 2>/dev/null &"); //notice the -cli is gone

これはうまくいきます。

$file_path は、実行中のファイルへのフル パスです /home/blah/path/blah.php

これを均一にして、すべてのサーバーで動作するようにするにはどうすればよいですか (少なくとも UNIX)

**編集* *

まあ、私はこのようにやっています。それは(おそらく)正しい方法ではありませんが、うまくいきます。

php-cli または php を使用する代わりに、両方を使用するので、一方が失敗した場合、もう一方が通過します。php は cgi または cli として実行されており、これらのいずれかがキャッチされます。また、出力がないため、エラーも発生しません。

exec("php-cli $file_path > /dev/null 2>/dev/null &");
exec("php $file_path > /dev/null 2>/dev/null &");

あなたがより良い解決策を知らない限り、私に知らせてください。ご助力いただきありがとうございます。

4

3 に答える 3

5
function php_exec($file_path) {
    if (!($binary = which(array('php', 'php5', 'php-cli', 'php-cgi'))))
        return false;

    return exec("$binary $file_path > /dev/null 2>/dev/null &");
}

function which($binaries) {
    if (!($path = getenv('PATH')) && !($path = getenv('Path')))
        return false;

    $arr = preg_split('/[:;]/', $path);

    foreach ($arr as $p) {
        foreach ($binaries as $b) {
            if (file_exists("$p/$b"))
                return "$p/$b";
        }
    }   

    return false;
}

var_dump(php_exec('test.php'));

説明: ほとんどのシステムでは、PHP バイナリーは php、php5、php-cli、または php-cgi と呼ばれます。which() 関数は、これらの名前ごとに標準パス (*nix と Windows の両方に PATH/Path という環境変数があります) をチェックし、そのような名前のファイルが見つかった場合はそれを返します。

PATH 変数の形式は次のとおり/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbinです。* nix (bash) およびC:\Windows\System32\;C:\Windows\;Windows の場合。そのため、preg_split('/[:;]/') を使用します。

falseこのソリューションは、有効な php バイナリが見つからない場合にphp_exec() が返されるため、あなたのソリューションよりも優れています。あなたのソリューションでは、スクリプトの実行が失敗したかどうかを知る方法はありません。

于 2012-05-03T14:34:58.967 に答える
1

おそらく単純な質問php-cliですが、すべてのホストに存在しますか? サイレントに失敗する理由は、すべてをリダイレクトするように指示しているためだと思います。

exec("php $file_path > /some/writable/path/output.log 2>/some/writable/path/error.log &");
于 2012-05-03T13:03:55.857 に答える
1

PHP-CLI バイナリのコンパイル方法によって異なります。ほとんどのシステムでは、実行可能ファイルの名前は「php」だけです。「php-cli」を持つホストでは手動でコンパイルされていると思いますが、他のほとんどのシステムでは OS パッケージ マネージャー経由でインストールされています。

これを回避して「ユニバーサル」にする方法は 2 つあります。

  1. 各サーバーで、必要に応じていずれかのエイリアスを追加するか、PHP 実行可能ファイルへのシンボリック リンクをどこかに作成します (ホーム ディレクトリなど)。
  2. 実行する前に、それらのどれが存在するかを確認し (通常は /usr/bin/ にあるはずです)、変数に設定します。
于 2012-05-03T13:14:35.473 に答える