2010-09-21 117 views
0

我有一個長時間運行的PHP腳本,它有一個內存泄漏導致它在部分路徑上失敗。該腳本使用第三方庫,我一直無法找到泄漏的來源。使用Bash持續運行PHP腳本

我想要做的是創建一個連續運行PHP腳本的bash腳本,一次處理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) 

回答

1

你必須使用bash調試PHP內存泄漏一個單獨的問題?你可以用PHP做這個:

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

$ ret變量將包含腳本的退出代碼。

+0

好主意。我決定走這條路。有關我的解決方案,請參閱http://stackoverflow.com/questions/3763304/continually-running-php-script-using-bash/3764636#3764636。 – 2010-09-21 21:27:34

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 
+0

第二個例子將正常工作,無需使用$?並進行測試。 – 2010-09-21 19:16:14

+0

你不必使用'/ bin/true',Bash有一個'true'內建。你也不需要使用'$?'。你的第二個例子是正確的方法。 – 2010-09-21 19:16:22

+0

在shell中,程序必須在成功時返回0。記住這個循環:) – levif 2010-09-21 21:18:53

0

使用一個簡單的until循環自動測試退出狀態的PHP腳本。

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

冒號只是一個空操作符,因爲您實際上並不想在循環中做任何其他操作。 until,同時執行命令script.php,直到它返回零(又名true)。如果腳本返回0表示未完成而不是1,則可以使用while而不是until

PHP腳本的輸出將轉到標準輸出和標準錯誤,因此您可以用一些I/O重定向來調用shell腳本來將輸出存儲到文件中。例如,如果腳本被稱爲loop.sh,你只要運行:

./loop.sh > output.txt 

但當然也可以在PHP腳本直接控制輸出文件;你只需要記住打開文件追加。

你可能要問有關如何,雖然:-)

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 
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);