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

时间:2012-05-03 13:01:31

标签: php exec command-line-interface

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

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

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

3 个答案:

答案 0 :(得分: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变量的格式为:* {nix(bash)为/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin,windows为C:\Windows\System32\;C:\Windows\;,因此我使用preg_split('/ [:;] /')

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

答案 1 :(得分:1)

或许是一个简单的问题,但所有主机上都存在php-cli吗?我认为它失败的原因是因为你告诉它将一切都重定向。

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

答案 2 :(得分:1)

这取决于PHP-CLI二进制文件的编译方式。在大多数系统上,可执行文件只是命名为'php',我猜有'php-cli'的主机手工编译,而其他大多数主机都是通过OS包管理器安装的。

您有两种方法可以解决这个问题并使其“普及”:

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