我有一个脚本在几个目录中执行一个文件,如下所示:
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 &");
除非您知道更好的解决方案,否则请告知我们。谢谢你的帮助。
答案 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包管理器安装的。
您有两种方法可以解决这个问题并使其“普及”: