【问题标题】:How can I run a php process in the background?如何在后台运行 php 进程?
【发布时间】:2013-07-06 10:43:41
【问题描述】:

我想在后台运行一个 php 脚本,因为它需要很长时间,我不想等待它。

这个问题涉及到:

php execute a background process

我试图在我的 linux centos 机器上进行这项工作,但不幸的是它似乎无法正常工作。

这是我的代码:

$cmd = 'php '.realpath($_SERVER["DOCUMENT_ROOT"]).'/test/sample.php';

exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile));
exec(sprintf("$s > $s 2>&1 & echo $1", $cmd, $outputfile),$pidArr); 

sleep(2);

print_r($outputfile);
print_r($pidfile);

我包含了 sleep(2) 以确保 sample.php 脚本完成。 sample.php 只包含 echo 'Hello world';我尝试了两个 exec 选项,但都没有工作。上面的脚本没有显示任何输出。

我尝试在 linux 命令行中运行相同的 $cmd,它显示了 sample.php 脚本的输出。

我想先运行它,但除此之外,我还想将变量发送到 sample.php 脚本。

非常感谢您的帮助。

【问题讨论】:

  • 令牌/cron:留下一个令牌,它可以是文件中的一行或数据库条目或类似的东西,由长期运行的 cron 作业搜索并控制其行为通常是从浏览器运行后台进程的好选择。管理员可以更好地控制 cron 作业的运行频率、它拥有的权限以及它正在做什么。
  • 谢谢,但我想在用户访问这个 php 脚本时立即运行它。

标签: php linux apache


【解决方案1】:

您可以使用set_time_limit(0) 允许脚本无限期运行,ignore_user_abort() 可以在后台继续运行脚本,即使选项卡的浏览器已关闭。这样,如果您将浏览器重定向到其他地方,脚本将继续在后台运行。

【讨论】:

  • 不确定ignore_user_abort 是否有效,因为运行 exec 不会创建 tty。此外,您最终可能会得到大量长时间运行的脚本,具体取决于脚本的作用。
【解决方案2】:

这种在后台运行 php 脚本的方法似乎有点尴尬。并且取决于您是否根据用户输入传递其他参数,还可能创建攻击者可以注入其他命令的场景。

对于这样的用例,如果您不需要立即响应,您可以使用 cron,或者像 Gearman 这样的作业管理器,您可以使用 Gearman 服务器来管理我们请求和后台作业。

【讨论】:

    【解决方案3】:

    我做了一些调整

    $cmd = 'php '.realpath($_SERVER["DOCUMENT_ROOT"]).'/test/sample.php';
    $outputfile = 'ouput.txt';
    $pidfile = 'pid.txt';
    exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile));
    exec(sprintf("$s > $s 2>&1 & echo $1", $cmd, $outputfile),$pidArr); 
    
    sleep(2);
    
    print_r(file_get_contents($outputfile));
    print_r(file_get_contents($pidfile));
    

    不确定您之前是否定义了变量。我在 Windows 上测试过,它可以工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 2013-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      相关资源
      最近更新 更多