使用Bash继续运行PHP脚本

时间:2010-09-21 18:29:04

标签: php bash scripting memory-leaks

我有一个长时间运行的PHP脚本,它有一个内存泄漏,导致它部分失败。该脚本使用第三方库,但我无法找到泄漏源。

我想要做的是创建一个bash脚本,该脚本不断运行PHP脚本,一次处理1000条记录,直到脚本返回退出代码,表示已完成处理所有记录。我认为这应该可以帮助我解决内存泄漏,因为脚本将运行1000条记录,退出,然后将为另外1000条记录启动一个新进程。

我对Bash并不熟悉。这可能吗?如何从PHP脚本中获取输出?

在伪代码中,我正在考虑以下内容:

do:
  code = exec('.../script.php')
   # PHP script would print 0 if all records are processed or 1 if there is more to do
while (code != 0)

5 个答案:

答案 0 :(得分:3)

$?为您提供bash中程序的退出代码

你可以做一些ilke

while /bin/true; do
  php script.php
  if [ $? != 0 ]; then
     echo "Error!";
     exit 1;
  fi
done

你甚至可以这样做:

while php script.php; do
   echo "script returned success"
done

答案 1 :(得分:1)

你必须使用bash吗?你可以用PHP做到这一点:

while (true) {
  $output = exec('php otherscript.php', $out, $ret);
}

$ ret变量将包含脚本的退出代码。

答案 2 :(得分:1)

你可以写:

#!/bin/bash 

/usr/bin/php prg.php # run the script.
while [  $? != 0 ]; do # if ret val is non-zero => err occurred. So rerun.
  /usr/bin/php prg.php
done

答案 3 :(得分:0)

使用简单的until循环自动测试PHP脚本的退出状态。

#!/bin/sh
until script.php
do
   :
done

冒号只是一个空操作符,因为你实际上并不想在循环中做任何其他操作。 执行命令untilscript.php,直到它返回零(也就是真)。如果脚本返回0表示未完成而不是1,则可以使用while而不是until

PHP脚本的输出将转为标准输出和标准错误,因此您可以使用一些I / O重定向来包装shell脚本的调用以将输出存储在文件中。例如,如果脚本名为loop.sh,则只需运行:

./loop.sh > output.txt

当然你可以直接在PHP脚本中控制输出文件;你只需记得打开要追加的文件。

您可能想问一个关于如何调试PHP内存泄漏的单独问题: - )

答案 4 :(得分:0)

在PHP中实现了解决方案,而不是:

do {
    $code = 1;
    $output = array();
    $file = realpath(dirname(__FILE__)) . "/script.php";
    exec("/usr/bin/php {$file}", $output, $code);

    $error = false;
    foreach ($output as $line) {
        if (stripos($line, 'error') !== false) {
            $error = true;
        }
        echo $line . "\n";
    }
} while ($code != 0 && !$error);