我正在努力获得一个php文件与php的exec()在后台运行。作为第一个测试,我尝试了:
exec("ls -l > logfile.txt 2> errfile.txt &");
很好。Logfile.txt将被目录列表填充。
根据php文档中的指令,由于exec启动了一个在后台运行的进程,标准输出(和标准错误)被重定向到一个文件。
现在,我试着
exec("/usr/bin/php -f /path/to/my.php > logfile.txt 2> errorfile.txt &");
似乎什么都没发生。
这里是我正在尝试的测试文件:
alpha.php
<?php
$version="a";
// Go do something we do not need to wait for.
exec("/usr/bin/php -f /path/to/beta.php > logfile.txt 2> errorfile.txt &");
?>
<html>
<head><title>Test</title></head>
<body>
<p>This is Alpha version <?php echo $version; ?></p>
</body>
</html>
beta.php
<?php
if (!($fp = fopen('/home/johnst12/public_html/workshops/admin/betadata.txt', 'w'))) { exit;}
fprintf($fp, "Proof that Beta executed.");
fclose($fp);
?>
如果我直接运行beta.php,它工作良好。txt获取消息。
如果我运行alpha.php来启动beta.php,则不会创建betadata.txt。Logfile.txt和errorfile.txt保持空(预期)。
我确信php的路径和我的php文件的路径是正确的。
在谷歌上搜索澄清没有结果。两个共同的主题似乎是:(A)资源耗尽?(b)缺乏对目标PHP文件的权限?耗尽资源似乎不太可能。该脚本的权限为全局read 644 (rw-r——r——)。我试着添加execute(755),以防它会有所帮助。这没什么区别。
PHP版本5.3.21Linux/Apache系统。safe_mode了
我错过了什么?谢谢。
首先:您是否验证了/usr/bin/php是PHP的正确路径?
Php不喜欢这样运行。与stdin有关。试试nohup:
exec("nohup /usr/bin/php -f /path/to/beta.php > logfile.txt 2> errorfile.txt &");
与-f任何其他看起来像一个标志将进入PHP,所以如果你想传递一个"-x"选项到你的脚本,那么你必须
/usr/bin/php -f /path/to/beta.php -- -x
如果没有,文件名之前的选项转到PHP,之后的选项转到脚本。
/usr/bin/php /path/to/beta.php -x
我假设您已经查看了这两个文件,以防它们有输出或错误?
其他一些检查:
删除这两个文件。每次代码运行时都重新创建它们吗?
exec("nohup /usr/bin/php -v > logfile.txt &");
应该输出版本信息到该日志文件。
exec("/usr/bin/php -f /path/to/beta.php > logfile.txt 2> errorfile.txt");
应该能正常运行脚本(但不能在后台运行)。