Я уже узнал, что вы не можете перехватить фатальные ошибки PHP, и ваш скрипт завершит работу, как только он попадет в него. Я запускаю большой набор тестов PHP (не PHPUnit, а собственное решение) на CI-сервере и хочу, чтобы результаты тестов / неудач сообщались в формате вывода JUnit.
Поскольку слишком много вещей в PHP являются «фатальными ошибками», я не хочу, чтобы фатальная ошибка заканчивала мой тестовый запуск, поэтому я решил использовать разветвление, что-то вроде этого:
foreach($tests as $test) {
$pid = pcntl_fork();
if ($pid) {
$test->run();
$test->write_junit($some_file_name);
}
else {
pcntl_wait($status);
if ($status) { //fatal error
// from here we have no data about why it
// crashed, since that was in the child's memory
}
}
}
Моя идея заключалась в том, чтобы закрыть STDERR в дочернем элементе и отправить его стандартную ошибку в канал, который родитель может прочитать и сохранить данные об ошибках в файл JUnit, но теперь я не знаю, возможно ли это. Можете ли вы изменить файл для STDERR? По сути, я хочу сделать что-то вроде popen , но без шага exec ().
Можно ли получить выходные данные дочернего процесса после его смерти от PHP-фатальной ошибки?