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


php exec() function and different hosts

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

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 &");

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

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('/[:;]/')

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

这取决于 PHP-CLI 二进制文件的编译方式。在大多数系统上,可执行文件仅被命名为"php",我猜具有"php-cli"的主机是手动编译的,而其他大多数主机则通过操作系统包管理器安装它。

您有两种选择来解决此问题并使其"通用":

  1. 在每个服务器上,在需要时为其中一个添加别名,或者在某处(例如在您的主目录中)创建一个指向 PHP 可执行文件的符号链接。
  2. 在执行之前,请检查其中哪一个存在(通常,它应该位于/usr/bin/中)并将其设置为变量。

也许是简单的问题,但是php-cli存在于所有主机上吗?我认为它默默失败的原因是因为你告诉它正在重定向所有内容。

exec("php $file_path > /some/writable/path/output.log 2>/some/writable/path/error.log &");