我正在努力使用PHP的exec()在后台运行一个php文件。作为第一次测试,我尝试了:
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,它运行正常。 Betadata.txt获取消息。
如果我运行alpha.php来启动beta.php,则不会创建betadata.txt。 logfile.txt和errorfile.txt保持为空(预期)。
我确信php的路径和我的php文件的路径是正确的。
谷歌搜索澄清并不富有成效。几个共同的主题似乎是(a)资源耗尽? (b)目标php文件缺乏权限?资源似乎不太可能。脚本的权限是全局读取644(rw-r - r--)。我尝试添加执行(755)以防万一它会有所帮助。它没有任何区别。PHP版本5.3.21 Linux / Apache系统。 safe_mode关闭
我错过了什么?感谢。
答案 0 :(得分:0)
首先:您是否确认/ 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");
应正确运行脚本(但不能在后台运行)。