Что такое УСПОКОИТЕЛЬНЫЙ способ контролировать ресурс REST для изменений?

Неустранимая ошибка: допустимый размер памяти из XXX байт исчерпан (пытался выделить XXX байты)

Недостаточно памяти для запуска вашего скрипта. PHP достиг предела памяти и перестает его выполнять. Эта ошибка является фатальной, сценарий останавливается. Значение предела памяти можно настроить либо в файле php.ini, либо с помощью ini_set('memory_limit', '128 M'); в скрипте (который перезапишет значение, определенное в php.ini). Цель ограничения памяти заключается в том, чтобы не допустить, чтобы один скрипт PHP собирал всю доступную память и приводил к остановке всего веб-сервера.

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

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

Вопросы, относящиеся:

36
задан Community 31 May 2015 в 18:59
поделиться

3 ответа

Ваше предлагаемое решение походит долгий опрос , который мог работать действительно хорошо.

Вы запросили бы /game/17/move/5, и сервер не отправит данных, пока перемещение 5 не было завершено. Если соединение отбрасывает, или Вы получаете тайм-аут, Вы просто снова соединяетесь, пока Вы не получаете допустимый ответ.

преимущество этого, это очень быстро - как только сервер имеет новые данные, клиент получит его. Это также эластично к выделенным соединениям и работает, если клиент разъединяется некоторое время (Вы могли бы запросить /game/17/move/5 спустя час после того, как это было перемещено и получает данные немедленно, затем переходит на move/6/ и так далее)

, проблемой с долгим опросом является каждый "опрос", связывает поток сервера, который быстро повреждает серверы как Apache (поскольку это исчерпывает рабочие потоки, так не может принять другие запросы). Вам нужен специализированный веб-сервер для обслуживания долго опрашивающих запросов.. Модуль Python twisted ("событийно-ориентированный сетевой механизм") является большим для этого, но это - больше работы, чем регулярный опрос..

В ответе на Ваш комментарий о Причале/Tomcat, у меня нет опыта с Java, но кажется, что они оба используют подобную pool-of-worker-threads систему для Apache, таким образом, это будет иметь ту же самую проблему. Я действительно находил это сообщение , который, кажется, решает точно эту проблему (для Tomcat)

25
ответ дан Community 27 November 2019 в 06:16
поделиться

Я нашел эта статья , предложив новый HTTP-заголовок, "When-Modified-After", который по существу делает то же самое - сервер ожидает и сохраняет соединение открытым, пока ресурс не изменяется.

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

2
ответ дан Ross 27 November 2019 в 06:16
поделиться

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

2
ответ дан Tracker1 27 November 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: