php exec()函数和不同的主机

Chr*_*s81 3 php exec command-line-interface

我有一个脚本,在几个目录中执行一个文件,如下所示:

exec("php-cli $file_path > /dev/null 2>/dev/null &"); //php command-line
Run Code Online (Sandbox Code Playgroud)

这适用于大多数主机,但有些主机不喜欢它并且它不运行,不会产生任何错误.

对于失败的主机,我使用

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

哪个工作正常.

$ 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 &");
Run Code Online (Sandbox Code Playgroud)

除非您知道更好的解决方案,否则请告诉我.感谢你的帮助.

str*_*kol 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'));
Run Code Online (Sandbox Code Playgroud)

说明:在大多数系统上,PHP二进制文件称为php,php5,php-cli或php-cgi.which()函数检查每个名称的标准路径(*nix和windows都有称为PATH/Path的环境变量),如果找到具有此名称的文件,它将返回它.

PATH变量的格式是:/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbinfor*nix(bash),C:\Windows\System32\;C:\Windows\;对于windows,这就是我使用preg_split('/ [:;] /')的原因

这个解决方案比你的好,因为false如果找不到有效的php二进制文件,php_exec()将返回.在您的解决方案中,无法知道脚本执行是否失败.