Постоянно работающий PHP скрипт с использованием Bash - PullRequest
0 голосов
/ 21 сентября 2010

У меня есть долго работающий PHP-скрипт, у которого есть утечка памяти, которая приводит к его сбою на полпути.Скрипт использует стороннюю библиотеку, и я не смог найти источник утечки.

Я хотел бы создать скрипт bash, который постоянно запускает скрипт PHP, обрабатывая 1000 записей ввремя, пока скрипт не вернет код завершения, сообщающий, что он завершил обработку всех записей.Я полагаю, что это должно помочь мне обойти утечку памяти, потому что скрипт будет работать для 1000 записей, завершится, а затем будет запущен новый процесс для еще 1000 записей.Возможно ли это сделать?Как мне получить вывод из скрипта 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 ]

3 голосов
/ 21 сентября 2010

$?выдает код выхода из программы в bash

Вы можете сделать что-то подобное

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 голос
/ 21 сентября 2010

Вы можете написать:

#!/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
1 голос
/ 21 сентября 2010

Вы должны использовать Bash? Возможно, вы могли бы сделать это с помощью PHP:

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

Переменная $ ret будет содержать код завершения скрипта.

0 голосов
/ 22 сентября 2010

Реализовано решение на 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);
0 голосов
/ 21 сентября 2010

Используйте простой цикл until для автоматической проверки состояния выхода сценария PHP.

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

Двоеточие - это просто нулевой оператор, поскольку на самом деле вы не хотите ничего делать впетля.until пока выполняйте команду script.php до тех пор, пока она не вернет ноль (иначе истина).Если сценарий возвратил 0, чтобы указать, что не выполнено вместо 1, вы можете использовать while вместо until.

Вывод сценария PHP будет выходить со стандартным выводом и стандартной ошибкой, так что вы можете обернутьвызов сценария оболочки с некоторым изменением направления ввода / вывода для сохранения вывода в файле.Например, если скрипт называется loop.sh, вы просто запустите:

./loop.sh > output.txt

, хотя, конечно, вы можете управлять выходным файлом непосредственно в скрипте PHP;вам просто нужно помнить, чтобы открыть файл для добавления.

Возможно, вы захотите задать отдельный вопрос о том, как отладить утечку памяти PHP, хотя: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...