我正在努力使用 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>
测试版.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--)。我尝试添加 execute (755) 以防万一。没什么区别。
PHP 版本 5.3.21 Linux/ Apache 系统。 安全模式关闭
我错过了什么?谢谢。
最佳答案
首先:您是否已验证/usr/bin/php 是 PHP 的正确路径?
Php 不喜欢那样运行。与标准输入有关。尝试使用 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");
应该正确运行脚本(但不是在后台)。
关于php - Exec 启动 php 作为后台进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16290784/