执行命令启动php作为后台进程


Exec to launch php as background process

我正在努力获得一个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");  

应该能正常运行脚本(但不能在后台运行)。