Немного ошибся с ob_start — для дописывания «хвоста, в чем же дело» после смерти скрипта нужно вызывать ob_start('function'),
например:
function myObHandler($str){
return $str . " - output is handled!";
}
// Handle the output stream and set a handler function.
ob_start('myObHandler');
// Generate a fatal error.
callToUndefinedFunction();
Может с ini_set у Вас что-то не так?
Тогда вот полный код:
<?php
// определеяем уровень протоколирования ошибок
error_reporting(E_ALL | E_STRICT);
// определяем режим вывода ошибок
ini_set('display_errors', 'On');
function myObHandler($str){
return $str . " - output is handled!";
}
// Handle the output stream and set a handler function.
ob_start('myObHandler');
// Generate a fatal error.
callToUndefinedFunction();
?>
29.01.2014, 06:58
Den1xxx
alexdrob, таки достали и поднял скрипты.
Смотрите теперь!
<?php
// определеяем уровень протоколирования ошибок
error_reporting(E_ALL | E_STRICT);
// определяем режим вывода ошибок
ini_set('display_errors', 'On');
//Назначаем буферизацию.
ob_start();
echo '<br />Start<br/>';
//Фатальная ошибка. Не забывайте — eval это ещё одна обёртка, без неё может не получиться.
eval('callToUndefinedFunction()');
//Тут скрипт уже мёртв; ну это вы так думаете, да
echo '<br />Hello';
$text = ob_get_contents();
ob_end_clean();
//А тут опять оживает:
echo '<br />Hello again!';
//А это вернулось зомби и съело ваши мозги:
echo $text;
?>
Hello again!
Start
Parse error: syntax error, unexpected $end in /var/www/intoby/data/www/test.into.by/test.php(11) : eval()'d code on line 1
Hello
Вывод: буферизация вывода может кешировать даже фатальные ошибки без разрушения внешнего окружения.
Однако, как ни странно, вызов несуществующей функции приводит к разрущению внешнего окружения — никакое кеширование не помогает.
Если честно, ранее не знал об этом — считал ошибки парсинга более фатальными:)
29.01.2014, 08:53
Degradator
Спасибо Den1xxx если б я мог, то обнял бы тебя. Через eval работает.
ps но из функции не работает
29.01.2014, 10:00
Den1xxx
Цитата:
Сообщение от Degradator
ps но из функции не работает
Работает же. Надо нужную функцию указать в ob_start('здесь_имя_функции')
Скрипт рушится при вызове несуществующей функции, а вот ошибки парсинга проглатывает без проблем — как ни странно.
Но это хоть что-то. Кстати в вызываемую функцию можно запихнуть сохранение в файл, отсылку на email или редирект на другую страницу (предпочтительно).
Кстати.
Где-то в фреймворке Yii-2 ещё решали похожую проблему, не знаю решили ли. alexdrob , насколько знаю Вы знаток этого фреймворка, не подскажете?
29.01.2014, 10:14
Degradator
Цитата:
Сообщение от Degradator
ps но из функции не работает
Да, работает, мой фейл. Мало работал с eval, и думал что вобще никогда с ним работать не буду. Сделал через
eval('include $filename');
так не прокатило
сделал
$file = @file_get_contents($filename);
eval ($file);
и все заработало
29.01.2014, 10:25
Den1xxx
Цитата:
Сообщение от Degradator
Сделал через
eval('include $filename');
Потому что надо семиколон в конце не забывать — eval('include $filename;');
Делаете ошибку парсинга собственными руками:)
29.01.2014, 10:44
alexdrob
Евал - это уде другое.
Цитата:
Сообщение от Den1xxx
Может с ini_set у Вас что-то не так?
Тогда вот полный код:
Да какой это полный код, я Вам дал Выше полный код. В Вашем полном коде, не хватает продолжения скрипта после фатальной ошибки, так что им не проверить.
Цитата:
Сообщение от Den1xxx
Не забывайте — eval это ещё одна обёртка, без неё может не получиться.
eval('callToUndefinedFunction()');
Кеширование не помогает не падать скрипту!
Вот щас даже проверил ваш код, не работает и с евал :)
<?php
function myObHandler($str){
return $str . " - output is handled!";
}
ob_start('myObHandler');
eval('callToUndefinedFunction();');
echo 'Я не выполнюсь!';
$text = ob_get_contents();
ob_end_clean();
var_dump($text);
echo 'и йа!';
Fatal error: Call to undefined function callToUndefinedFunction() in D:\Apache\htdocs\1.php(9) : eval()'d code on line 1
- output is handled!
В примере который вы показали, ошибка не фалтальная а парсинга.
Цитата:
Сообщение от Den1xxx
Где-то в фреймворке Yii-2
Цитата:
Сообщение от Den1xxx
alexdrob , насколько знаю Вы знаток этого фреймворк
с каких пор я знаток этого фв? он даже не вышел в релиз и я смотрел его код, мне симфони 2 больше нравится, так что вряд ли я буду знатком юии 2 :D
29.01.2014, 10:48
alexdrob
Ну то етсь в свой скрипт допишите ; в евал, что бы был фатал ерор