Chr*_*s81 3 php exec command-line-interface
我有一个脚本,在几个目录中执行一个文件,如下所示:
exec("php-cli $file_path > /dev/null 2>/dev/null &"); //php command-line
Run Code Online (Sandbox Code Playgroud)
这适用于大多数主机,但有些主机不喜欢它并且它不运行,不会产生任何错误.
对于失败的主机,我使用
exec("php $file_path > /dev/null 2>/dev/null &"); //notice the -cli is gone
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.
$ 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 &");
Run Code Online (Sandbox Code Playgroud)
除非您知道更好的解决方案,否则请告诉我.感谢你的帮助.
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'));
Run Code Online (Sandbox Code Playgroud)
说明:在大多数系统上,PHP二进制文件称为php,php5,php-cli或php-cgi.which()函数检查每个名称的标准路径(*nix和windows都有称为PATH/Path的环境变量),如果找到具有此名称的文件,它将返回它.
PATH变量的格式是:/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbinfor*nix(bash),C:\Windows\System32\;C:\Windows\;对于windows,这就是我使用preg_split('/ [:;] /')的原因
这个解决方案比你的好,因为false如果找不到有效的php二进制文件,php_exec()将返回.在您的解决方案中,无法知道脚本执行是否失败.
| 归档时间: |
|
| 查看次数: |
1197 次 |
| 最近记录: |