2017-02-07 2 views
2

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

Когда сбой PHP-скрипта (ошибка в скрипте, бесконечные циклы, бесконечные вызовы SQL и т. Д.), Весь сервер «занят». Это похоже на то, что все ресурсы взяты и сосредоточены на попытке выполнить этот скрипт. При перезапуске apache/nginx сервер возвращается в нормальное состояние.

Как этого можно избежать? Установка тайм-аута для скрипта не решит его, потому что если это даже 10-секундный тайм-аут, сервер будет безответственным для этих 10 секунд для всех.

Есть ли способ избежать этого? Да, решение проблем сценария проблемы прекратится, но я уверен, что есть способ защитить это от сервера.

Сейчас мне приходит в голову пример. Этот сценарий использовался для получения кода страны путем вызова службы на этом веб-сайте. По какой-то причине веб-сайт не будет служить нам случайным образом, поэтому скрипт будет ждать навсегда получения содержимого файла.

$getcountry = file_get_contents('http://ip-api.com/php/'. getUserIP()); 

Благодаря

ответ

3

Настройка тайм-аута для сценария не решить, потому что если это даже 10 секунд таймаут сервер будет безответственность за эти 10 секунд для всех.

Нет, если ваш сервер настроен правильно. Установка таймаута PHP - это правильный способ обработки сценариев убегания (кроме устранения фактической причины проблемы). Ошибки фатального скрипта будут немедленно прекращены и не будут забираться на серверные ресурсы.

Ваше сообщение, похоже, предполагает, что в любой момент существует только один экземпляр PHP-скрипта. Это не должно быть так. Ваш веб-сервер должен запускать новые процессы или потоки, вплоть до определенного настроенного предела, для каждого веб-запроса, обрабатываемого PHP. Или, если вы используете PHP-FPM, он передается пулу процессов PHP. Ни в коем случае весь ваш сервер не будет заблокирован для одного запроса.

Теперь, если ваш код или сервер имеют серьезные проблемы, все запросы могут занять слишком много времени и отложить дальнейшие запросы. Единственное решение - исправить корень проблемы и сохранить разумный тайм-аут в качестве отказоустойчивого.

Для Apache это некоторые из настроек, которые вы хотите проверить: ServerLimit, StartServers, MaxClients. Для PHP-FPM вы должны начать с настройки max_children.

Этот сценарий использовался для получения кода страны путем вызова службы на этом веб-сайте. По какой-то причине веб-сайт не будет служить нам случайным образом, поэтому скрипт будет ждать навсегда получения содержимого файла.

Это очень распространенная проблема и вы должны учесть ваш код. Вы никогда не сможете доверять тому, что сторонняя служба вернется незамедлительно. Очевидно, что запросы на перегрузку, такие как это для фоновых процессов, являются лучшими (например, crons). Но если это нужно сделать как часть обычного запроса страницы, вы всегда должны установить разумный тайм-аут. Для вашего конкретного примера использования file_get_contents, уменьшить время ожидания сокета:

ini_set('default_socket_timeout', 10); // 10 seconds 
+0

Спасибо, очень четко объяснил, и вы дали мне очень хорошие указатели для улучшения. –

Смежные вопросы