php - Exec 启动 php 作为后台进程

标签 php shell exec

我正在努力使用 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/

相关文章:

php - 无法安装,当前用户无法写入 channel "pecl.php.net"的 php_dir

php - 如何将这两个查询合并为一个?

php - 如何从 php 传递参数调用 bash 脚本

php - echo 逐行执行命令的结果

php - 不在选定的特定单选按钮上显示其他结果

php - 如何将不同部分的用户统计信息存储在数据库(mysql)中?

linux - 通过交互式 shell 与脚本查找名称中带有星号 (*) 的文件

c++ - 使用 SIGHUP 重新启动终止的进程

bash - 使用 ./dot-slash 运行 shell 脚本

c - (Unix/Linux) 我如何从另一个需要输入文件的 C 程序执行 C 程序?