2016-04-05 12 views
0

Я бег цикла, который выполняет то же приложение, как только раунд закончен, используя proc_open, как это:PHP CLI консоль закрытие на ошибках

$description = array(
0 => array("pipe", "r"), 
1 => array("pipe", "w"), 
2 => array("file", "proc_open_errors", "a+") 
); 

$command = "start /min php $operador_php"; 
$process = proc_open($command, $description, $pipe); 

if (is_resource($process)) { 
    print_r($process); 
    sleep(5); 
    fclose($pipe[0]); 
    fclose($pipe[1]); 
    $process_response = proc_close($process); 
    echo $process_response; 
} 

Проблема у меня есть, что после нескольких часов работы, одно из исполнений может потерпеть неудачу в середине, сломав весь цикл. И он закрывается (в Windows), поэтому я не вижу, в чем проблема.

Есть ли способ предотвратить закрытие CLI PHP в случае возникновения проблемы? или я должен использовать последовательность «if/else», чтобы проверить, есть ли какие-либо проблемы во время выполнения? Любая другая идея?

+0

В моем проекте для каждого proc имеется новый файл журнала, содержащий каждый вывод консоли. Вы должны это учитывать. – Random

+0

Yeap, я думаю, что это лучший вариант, который у меня есть ... Это также предложение Дэна Фаррелла. "> output.txt Спасибо большое! –

ответ

1

У вас есть варианты, но это зависит от того, как вы его выполняете.

Один из вариантов - настроить обработку ошибок в скрипте php. По крайней мере, вы можете поймать общие исключения и зарегистрировать их перед сбоем. Еще лучше, во многих случаях вы сможете восстановить ошибки. В любом случае, http://php.net/manual/en/language.exceptions.php может быть интересным.

Простым подходом и, возможно, хорошим местом для начала было бы перенаправить вывод из сценария в другой файл. Redirect Windows cmd stdout and stderr to a single file показывает простой вызов - работает одинаково в unix. Таким образом, окно все равно исчезнет, ​​но вы сможете просматривать журналы отдельно. Это определенно лучшая практика при выполнении автоматических скриптов в любой ОС. Просто убедитесь, что вы правильно обрабатываете размер выходного файла (если PHP-скрипт будет работать вечно, вам нужно будет сделать что-то более умное, чтобы журнал не заполнил ваш жесткий диск).

Наконец, если вы вручную вызываете скрипт php из командной строки, я не думаю, что командная строка выйдет, когда скрипт выйдет, но я думаю, что я не был бы шокирован, если бы это произошло (в отличие от того, окна автоматически запускают оболочку для процесса, а затем автоматически завершают магию, когда это делается).

+0

Спасибо Dan, это было совершенно очевидно, но я в последнее время исчерпал себя ... php scriptname.php> logs.txt –

+0

@ChrisRusso не позволяйте своему истощенному уму пропустить стандартную ошибку это может быть актуально для вас (зависит от того, как ваш журнал ошибок, но я подозреваю, что вы захотите обоим) –

0

Вот еще решение, которое я нашел на SO:

ini_set("log_errors", 1); 
ini_set("error_log", "/php_error.log"); 
error_log("Hello, errors!"); 

Я бы рекомендовал поместить код в начало файла PHP. Я хотел бы уточнить, это особенно полезно, если вы взаимодействуете с другими серверами, а ответ - это не всегда то же самое, так что, если есть какие-либо исключения в 3 часа утра, это будет сохранен в файле, указанном во второй строке.