我有一个长时间运行的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)
答案 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
冒号只是一个空操作符,因为你实际上并不想在循环中做任何其他操作。
执行命令until
时script.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);