【问题标题】:PHP execute a script in the backgroundPHP在后台执行脚本
【发布时间】:2013-04-16 21:25:08
【问题描述】:

我必须在后台执行一个 php 脚本 (a.php)。我试过了,但它不起作用:

<?
$cmd = "php /home/megad404/www/prove/a.php &> /dev/null &";
exec('/bin/bash -c "'.$cmd.'"',$output,$return);
if($return===0)
{
    echo 'Successful';
} 
else
{
    echo 'Unsuccessful';
}
?>

它返回“成功”但它不执行 a.php

a.php:

<?
file_put_contents(date("s"),"");
sleep(5);
file_put_contents(date("s"),"");
sleep(5);
file_put_contents(date("s"),"");
?>

a.php 每 5 秒写入一个文件,它工作正常,除非我尝试使用第一个脚本在后台执行它。

【问题讨论】:

  • php shell 脚本仍然必须在其中包含&lt;?php 以触发 php 模式。否则 php 只会将其视为文本。请记住:没有“php 脚本”之类的东西。只有文件中包含 php 代码块。
  • 自从 bash 成功返回以来,您每次都“成功”——也许与您的 php 无关。
  • 我知道,但我应该怎么做才能让它发挥作用?
  • 根据问题stackoverflow.com/questions/4646788/…你不需要使用bash -c。如果你按照那里显示的那样做,它会起作用吗?
  • 删除 /bin/bash -c 然后运行它。您可能需要 php.ini 的完整路径。 which php 会帮你拿的。

标签: php background exec


【解决方案1】:

您可以尝试适配 mi 脚本。 查看命令 shell_exec() 而不是 exec()。第一个 return all ,第二个最后一行。

function run_in_background($Command, $Priority = 0) {
         if($Priority)
             $PID = shell_exec("nohup nice -n $Priority $Command > /dev/null & echo $!");
         else
             $PID = shell_exec("nohup $Command > /dev/null & echo $!");
         return($PID);
 }
     //Verifies if a process is running in linux
function is_process_running($PID) {
         exec("ps $PID", $ProcessState);
         return(count($ProcessState) >= 2);
}

例子

$PIDPHP=run_in_background("php -S 127.0.0.1:18086 ".__DIR__."/index.php"); // or any other process.

if (is_process_running($PIDPHP)){
    exec("kill $PIDPHP");
}

【讨论】:

    【解决方案2】:

    您还可以考虑使用真正的 Posix/PCNTL 功能将脚本实际分离到后台,例如。使用 pcntl_exec 和 pcntl_fork()。在我看来,这是处理运行时间较长的后台脚本的正确方法,因为您可以与子/进程进行通信以获取更新、状态等,甚至让他们了解真正的信号处理。

    PCNTL - http://www.php.net/manual/en/book.pcntl.php

    POSIX - http://www.php.net/manual/en/book.posix.php

    干杯

    【讨论】:

      【解决方案3】:

      这对我有用:

      <?php
      
      $cmd = "/usr/bin/php /home/auser/a.php &> /dev/null &";
      exec($cmd,$output,$return);
      sleep(30);
      if($return===0)
      {
          echo 'Successful';
      } 
      else
      {
          echo 'Unsuccessful';
      }
      ?>
      

      我将它保存为 runa.php 并从命令窗口将其作为 php runa.php 运行。 它产生了 3 个文件。

      运行 a.php 也适用于 cron 作业:

      ]$ crontab -l
      18 * * * * /usr/bin/php /home/auser/a.php
      

      我把脚本放到了一个web目录下,发现我写的有点问题。您可以在服务器日志中看到什么?

      sudo tail -f /var/log/httpd/error_log
      

      如果你从网络浏览器点击 a.php 会怎样?因为你提到的脚本是755,但是目录呢。也许它需要 775 或 777 进行测试,以便脚本可以写入文件?

      为了测试,我创建了一个子目录“输出”并更改了 a.php

      <?php
      ini_set('date.timezone','America/New_York'); //without this it makes extra messages
      
      error_log("a.php putting contents", 0);
      file_put_contents("output/".date("s"),"");
      sleep(5);
      file_put_contents("output/".date("s"),"");
      sleep(5);
      file_put_contents("output/".date("s"),"");
      error_log("a.php done", 0);
      ?>
      

      在我授予输出文件夹写入权限之前,它无法写入文件

      sudo chmod 777 /var/www/html/output
      

      然后我发现apache用户正在写文件:

      ~]$ sudo ls -l /var/www/html/output/
      total 0
      -rw-r--r--. 1 apache apache 0 Apr 18 11:38 00
      -rw-r--r--. 1 apache apache 0 Apr 18 11:38 05
      -rw-r--r--. 1 apache apache 0 Apr 18 11:37 55
      

      所以我改变了输出的所有者,以再次降低权限。

      ~]$ sudo ls -lu /var/www/html/ | grep output
      drwxr-xr-x. 2 apache root 4096 Apr 18 12:21 output
      

      现在也可以使用:

       ~]$ sudo ls -l /var/www/html/output
      total 0
      -rw-r--r--. 1 apache apache 0 Apr 18 12:21 44
      -rw-r--r--. 1 apache apache 0 Apr 18 12:21 49
      -rw-r--r--. 1 apache apache 0 Apr 18 11:37 55
      

      【讨论】:

      • 什么都没有改变...它返回成功但什么也没发生
      • 我运行了上面的更改并得到了两种方式的结果。也许 sleep 足以让其他脚本有时间运行。我不知道您是否可以通过浏览器启动并在后台运行它。 cron 更好。
      • 它不起作用...会不会是服务器问题?还有其他方法可以在后台运行脚本吗?
      • 嘿。你的用户写权限呢?试试 su -c "/usr/bin/php /path/to/a.php"
      • 哦,正如另一位评论者指出的那样,一个服务器问题可能是您的短标签。在“a.php”中使用&lt;?php 如果服务器设置了“无短标签”选项,有时我会看到文件失败。
      猜你喜欢
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 2021-08-27
      • 1970-01-01
      相关资源
      最近更新 更多