Intereting Posts
blueimp. Выберите только несколько строк с помощью Select ..Where. Это не работает? MySQL Возвращает различное количество строк на localhost vs live server для одного и того же кода Как проверить, предоставил ли пользователь определенный набор разрешений для моего PHP-приложения? Эмулировать множественное наследование в php Замените пробелы & nbsp; между тегами PRE Действительно ли mysql_real_escape_string () ПОЛНОСТЬЮ защищает от SQL-инъекции? Загружать видео на фан-страницу через PHP API как отображать данные отношения в формате json из двух таблиц в yii2 restful api Zend Forms – модификация идентификатора элемента для повторного использования Использование jQuery для отправки данных из multipart / form-data через ajax Что такое минимальное значение mt_rand () для PHP и как рассчитать 32-битный интергель на 32-битной Linux-панели Выбор пути к папке с использованием файла типа ввода Как распознавать имена из текста, используя php xpath получает элемент по индексу Использование одного сайта для нескольких доменов в PHP

Неустранимая ошибка php

Есть ли способ сделать код продолжением (а не выходом), когда вы получите фатальную ошибку в PHP? Например, я получаю фатальную ошибку таймаута и хочу, чтобы всякий раз, когда случалось пропустить эту задачу, и продолжить с другими. В этом случае сценарий завершается.

Существует хак, использующий буферизацию вывода, которая позволит вам регистрировать определенные фатальные ошибки, но нет способа продолжить сценарий после возникновения фатальной ошибки – вот что делает его фатальным!

Если ваш скрипт отключен, вы можете использовать set_time_limit() чтобы дать ему больше времени для выполнения.

«Неустранимая ошибка», как указывает ее имя, является Fatal: она останавливает выполнение скрипта / программы.

Если вы используете PHP для создания веб-страниц и получаете фатальную ошибку, связанную с max_execution_time которая по умолчанию равна 30 секундам, вы, безусловно, занимаетесь тем, что действительно занимает слишком много времени: пользователи, вероятно, не дождались так долго, чтобы получить стр.

Если вы используете PHP для выполнения тяжелых вычислений, а не на веб-странице (но через CLI или cron или тому подобное) , вы можете установить другое (большее) значение для max_execution_time . У вас есть два способа сделать это:

Сначала нужно изменить php.ini, чтобы установить это значение (оно уже находится в файле, просто отредактируйте значение свойства). Проблема в том, что он изменит ее и для веб-сервера, что плохо (это, в конце концов, мера безопасности) . Лучше всего создать копию php.ini, вызванную, например, phpcli.ini, и изменить этот файл. Затем используйте его при вызове php:

 php -c phpcli.ini myscript.php 

Это будет отлично работать, если у вас есть много свойств, которые необходимо настроить для выполнения CLI. (Подобно memory_limit , который часто должен быть установлен на более высокое значение для длинных партий)

Другой способ – определить другое значение max_execution_time при вызове php, например:

 php -d max_execution_time=60 myscript.php 

Это здорово, если вы запустите это через crontab, например.

Это зависит от точного типа ошибки. Вы можете ловить ошибки, создавая свой собственный обработчик ошибок. См. Документацию по set_error_handler () , но не все типы ошибок могут быть обнаружены. Посмотрите на ошибку тайм-аута, которую вы получите, и посмотрите, какой тип он есть. Если это один из E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR или E_COMPILE_WARNING, то вы не можете поймать его обработчиком ошибок. Если это другой тип, то вы можете. Поймайте его обработчиком ошибок и просто верните.

Если у вас есть подходящая версия PHP (PHP> = 5.2 для error_get_last), вы можете попробовать описанную здесь методику, которая использует register_shutdown_function и error_get_last.

Это не позволит вам «продолжить», когда вы получите фатальную ошибку, но, по крайней мере, позволяет вам регистрировать ошибку (и, возможно, отправлять предупреждающее письмо), перед тем, как вывести пользовательскую страницу ошибок пользователю.

Он работает примерно так:

 function fatalErrorHandler() { $lastError = error_get_last(); if (isset($lastError["type"]) && $lastError["type"]==E_ERROR) { // do something with the fatal error } } ... register_shutdown_function('fatalErrorHandler'); 

Несколько моментов:

  • вы можете использовать ob_clean () для удаления любого содержимого, которое было создано до фатальной ошибки.
  • это действительно плохая идея сделать что-либо для интенсивной работы обработчика выключения, этот метод касается изящного отказа, а не восстановления.
  • что бы вы ни делали, не пытайтесь зарегистрировать ошибку в базе данных … что, если это был таймаут базы данных, вызвавший фатальную ошибку?
  • по какой-то причине у меня были проблемы с тем, чтобы эта техника работала в 100% случаев при разработке в Windows с использованием WAMP.

Есть ли способ ограничить время выполнения функции, но не весь скрипт? Например

 function blabla() { return "yes"; } 

сделать так, чтобы, если он не был выполнен за 25 секунд, чтобы вернуть его;

Самый простой ответ, который я могу вам дать, – это эта функция: http://php.net/manual/en/function.pcntl-fork.php

Более подробно, что вы можете сделать, это:

  • Выполните часть процесса, который, по вашему мнению, может или не может вызвать фатальную ошибку (то есть большую часть вашего кода)
  • Скрипт, который создает процесс, должен быть очень простым скриптом.

Например, это то, что я сделал бы с очередью работы, которую у меня есть:

 <?php // ... load stuff regarding the job queue while ($job = $queue->getJob()) { $pid = pcntl_fork(); switch ($pid) { case -1: echo "Fork failed"; break; case 0: // do your stuff here echo "Child finished working"; break; default: echo "Waiting for child..."; pcntl_wait($status); // check the status using other pcntl* functions if you want break; } }