【问题标题】:nohup: run PHP process in backgroundnohup:在后台运行 PHP 进程
【发布时间】:2011-07-14 09:36:26
【问题描述】:

我尝试在后台运行 php 进程并从 php 文件启动它。

一些信息:PHP 版本 5.2.17,php safe_mode 已关闭,linux 系统。我用 exec 开始这个过程,已经尝试过 shell_exec。我将所有文件设置为 0755、0777。

$pid = exec("nohup $cmd > /dev/null 2> /dev/null & echo $!");

如果我打印这个语句,我会得到这个并且 pid 没问题:

nohup /usr/local/bin/php5 /.../../file.php > /dev/null 2> /dev/null & echo $!

如果我在 ssh 下查找进程

top

我看到我的 php5 进程具有正确的 pid。用户是root

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                      
 3533 xxxxxxxx  20   0 21356 8868 4580 S    0  0.4   0:00.13 php5                                                                                          
 3536 xxxxxxxx  20   0 20836 8260 4428 S    0  0.4   0:00.09 php5                                                                                          
 3539 xxxxxxxx  20   0 20836 8260 4428 S    0  0.4   0:00.09 php5                                                                                          
 3542 xxxxxxxx  20   0 20836 8260 4428 S    0  0.4   0:00.09 php5                                                                                          
 3545 xxxxxxxx  20   0 20836 8260 4428 S    0  0.4   0:00.09 php5                                                                                          
 3548 xxxxxxxx  20   0 20836 8260 4428 S    0  0.4   0:00.09 php5                                                                                          
 3551 xxxxxxxx  20   0 20836 8260 4428 S    0  0.4   0:00.09 php5    

如果我启动流程手册顶部看起来像这样:

PID  USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
8141 xxxxxxxx  22   2 24048 9.9m 5344 S   10  0.5   0:00.31 php5 

问题: 似乎什么也没发生。为了调试一点,我在文件中写了一个输出

ob_start();
echo "STARTING...";
writeLog(ob_get_contents());
//...
function writeLog($info){
    $handle = fopen("file.log", "a+");
    fwrite($handle, $info);
    fclose($handle);
} 
exit;

我的文件中没有日志。如果我在浏览器中启动此文件,它会正确处理并获取带有“调试”信息的 file.log。

为什么这在浏览器中运行而不是在 exec/shell_exec 命令上运行??!我有这些具有正确 pid 的 php 进程,但没有结果。

非常感谢您的帮助!

【问题讨论】:

  • 您应该首先尝试为您尝试执行的脚本提供一个绝对路径,而不是您现在似乎正在做的相对路径。 IE。使用nohup /usr/local/bin/php5 /absolute/path/to/file.php > /dev/null 2> /dev/null & echo $!
  • 我有这个文件的绝对路径。我可以从 ssh 中的每个目录启动这个 nohup。它的工作。不幸的是,没有 php。
  • 那么可能是权限问题。因此,请检查您的日志(Apache、php 错误日志、控制台日志)...如果您正在运行 AppArmor/SELinux,请尝试将其关闭以测试您是否需要更改安全策略以允许这些后台任务。

标签: php process background cron nohup


【解决方案1】:

PHP CLI 环境可以不同于 Web 环境(mod_php、FCGI 等)。当从命令行运行而不是通过网络服务器调用它时,脚本完全有可能因错误而死。调试你的脚本。如果可以的话,SSH 到你的服务器,su 到 webserver 用户并自己从命令行运行脚本。

如果你做不到,设置你自己的开发服务器,在那里你可以做到这一点(如果你了解一些 Linux,这并不难)。

【讨论】:

    【解决方案2】:

    除了可能的权限问题,此处发布了类似的答案 - https://stackoverflow.com/a/22705727/3471333

    nohup /usr/local/bin/php5 /.../../file.php </dev/null 2> /dev/null & echo $!
    

    【讨论】:

      【解决方案3】:
      $arg1 = escapeshellarg("Hello World");
      $pid = shell_exec("php file.php {$arg1} >/dev/null 2>&1 &");
      

      文件.php

      $argument = $argv[1];
      

      【讨论】:

        猜你喜欢
        • 2020-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-21
        • 1970-01-01
        • 2012-10-05
        相关资源
        最近更新 更多