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

2019-06-25 07:57发布

我有执行一对夫妇的目录下,看起来像这样一个文件的脚本:

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

除非你知道一个更好的解决方案,请让我知道。 感谢你的帮助。

Answer 1:

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的。 其中()函数检查每个这些名称的标准路径(包括* nix中和窗户都被称为环境变量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()将返回false ,如果它不能找到一个有效的PHP二进制文件。 在您的解决方案有没有办法知道,如果脚本执行失败。



Answer 2:

这取决于PHP-CLI二进制文件的编译方式。 在大多数系统中可执行文件被命名为只是“PHP”,我想,对具有“PHP-CLI”的主机已经是手工编制,而大多数人都它通过OS包管理器安装。

你有两个选择来解决这一点,使“通用”:

  1. 在每个服务器,添加一个别名,在需要他们中的一个,或者做一个符号链接到PHP可执行文件的某个地方(例如,在你的home目录)。
  2. 之前执行,检查它们中的哪一个的情况下(通常,应当位于/ usr / bin中/),并将其设置为变量。


Answer 3:

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

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


文章来源: php exec() function and different hosts