Недостаточно памяти для запуска вашего скрипта. PHP достиг предела памяти и перестает его выполнять. Эта ошибка является фатальной, сценарий останавливается. Значение предела памяти можно настроить либо в файле php.ini
, либо с помощью ini_set('memory_limit', '128 M');
в скрипте (который перезапишет значение, определенное в php.ini
). Цель ограничения памяти заключается в том, чтобы не допустить, чтобы один скрипт PHP собирал всю доступную память и приводил к остановке всего веб-сервера.
Первое, что нужно сделать, это свести к минимуму объем памяти, необходимый вашему сценарию , Например, если вы читаете большой файл в переменной или извлекаете много записей из базы данных и сохраняете их все в массиве, которые могут использовать много памяти. Измените свой код, чтобы вместо этого читать строки по строке или извлекать записи базы данных по одному, не сохраняя их все в памяти. Это требует немного концептуального понимания того, что происходит за кулисами, и когда данные хранятся в памяти и в других местах.
Если эта ошибка возникла, когда ваш сценарий не выполнял интенсивную работу с памятью, вы вам нужно проверить свой код, чтобы узнать, есть ли утечка памяти. Функция memory_get_usage
является вашим другом.
Вопросы, относящиеся:
Ваше предлагаемое решение походит долгий опрос , который мог работать действительно хорошо.
Вы запросили бы /game/17/move/5
, и сервер не отправит данных, пока перемещение 5 не было завершено. Если соединение отбрасывает, или Вы получаете тайм-аут, Вы просто снова соединяетесь, пока Вы не получаете допустимый ответ.
преимущество этого, это очень быстро - как только сервер имеет новые данные, клиент получит его. Это также эластично к выделенным соединениям и работает, если клиент разъединяется некоторое время (Вы могли бы запросить /game/17/move/5
спустя час после того, как это было перемещено и получает данные немедленно, затем переходит на move/6/
и так далее)
, проблемой с долгим опросом является каждый "опрос", связывает поток сервера, который быстро повреждает серверы как Apache (поскольку это исчерпывает рабочие потоки, так не может принять другие запросы). Вам нужен специализированный веб-сервер для обслуживания долго опрашивающих запросов.. Модуль Python twisted
("событийно-ориентированный сетевой механизм") является большим для этого, но это - больше работы, чем регулярный опрос..
В ответе на Ваш комментарий о Причале/Tomcat, у меня нет опыта с Java, но кажется, что они оба используют подобную pool-of-worker-threads систему для Apache, таким образом, это будет иметь ту же самую проблему. Я действительно находил это сообщение , который, кажется, решает точно эту проблему (для Tomcat)
Я нашел эта статья , предложив новый HTTP-заголовок, "When-Modified-After", который по существу делает то же самое - сервер ожидает и сохраняет соединение открытым, пока ресурс не изменяется.
я предпочитаю основанный на версии подход, а не основанный на метке времени подход, так как это менее подвержено условиям состязания и дает Вам немного больше информации о том, что это, Вы получаете. Какие-либо мысли этому подходу?
Я предложил бы 404, если Ваш намеченный клиент является веб-браузером, поскольку хранение открытого соединения может активно заблокировать запросы браузера в клиенте к тому же домену. Это до клиента, как часто опросить.