我有执行一对夫妇的目录下,看起来像这样一个文件的脚本:
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的。 其中()函数检查每个这些名称的标准路径(包括* 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二进制文件。 在您的解决方案有没有办法知道,如果脚本执行失败。
这取决于PHP-CLI二进制文件的编译方式。 在大多数系统中可执行文件被命名为只是“PHP”,我想,对具有“PHP-CLI”的主机已经是手工编制,而大多数人都它通过OS包管理器安装。
你有两个选择来解决这一点,使“通用”:
- 在每个服务器,添加一个别名,在需要他们中的一个,或者做一个符号链接到PHP可执行文件的某个地方(例如,在你的home目录)。
- 之前执行,检查它们中的哪一个的情况下(通常,应当位于/ usr / bin中/),并将其设置为变量。
简单的问题或许是,但php-cli
中的所有主机存在吗? 我认为它默默地失败的原因是因为你告诉它是重定向一切的。
exec("php $file_path > /some/writable/path/output.log 2>/some/writable/path/error.log &");