Поскольку мой вопрос становится все длиннее и длиннее, я решил переписать весь вопрос, чтобы сделать его лучше и короче.
Я запускаю свой сайт на выделенном сервере с 8 ГБ памяти. Я полностью осознаю, что мне нужно увеличить лимит памяти на настройке php.ini. Я установил его с 128M до 256M и до -1. Тем не менее проблема заключается в настойчивости.
Неустранимая ошибка: Недостаточно памяти (выделено 786432) (попытался выделить 24576 байт) в D:\www\football\views\main.php в строке 81
Из памяти не имеет смысла, потому что сказано, что выделено только 786432 байта, и ему нужно еще 24576 байт.
786432 байта составляет всего 768 килобайт и довольно мало.
Советы
- Ошибка происходит на очень случайной строке. Это не всегда ошибка на строке номер 81.
- В пиковое время Apache занимает всего 500 мб памяти. У меня все еще есть 6 ГБ.
- Нет бесконечного цикла.
- script занимает 1,042,424 байт. Получение этого номера из
echo memory_get_peak_usage();
- Набор результатов из MySQL мал (не более 12 строк, чисто текст, без данных BLOB)
- (Важная) Если я перезапускаю Apache один раз в два дня, ошибка исчезнет. Обычно это происходит, когда Apache работает более 2 дней.
- Я включил профилирование script, и вы можете получить его здесь.
- Этот выделенный сервер используется исключительно для запуска только одного веб-сайта. Этот веб-сайт является веб-сайтом с высоким трафиком со скоростью в среднем 1000 посетителей каждую минуту. В пиковое время одновременно будет доступно от 1 700 до 2000 посетителей.
Спецификация сервера
ОС: 64-разрядная версия Windows 2008 R2 Процессор: Intel Core i5 - 4 ядра
ОЗУ: 8 ГБ
Apache 2.2
PHP 5.3.1
Хранение: жесткие диски 2 x 1 ТБ
Полоса пропускания: 10 ТБ в месяц
Решение
Я наконец-то настроил и исправил проблему, и я хотел бы поделиться ею здесь, что я сделал, чтобы улучшить:
-
favicon.ico
отсутствовал, что испортило мой механизм маршрута. Хотя мой механизм маршрутов очень мал, но включивfavicon.ico
, он помогает сократить использование памяти, не запуская мой механизм маршрута. У большей части моего веб-сайта есть это, и я забыл поместить его в этот новый раздел. -
Лимит
MaxRequestPerChild
помогает. На моем другом выделенном сервере у меня ограниченныйMaxRequestPerChild
. Для этого сервера я установил его равным 0. Я всегда думал, что каждый script изолирован. Допустим, если мой script занимает 800kb для запуска. По завершении Apache или PHP должны освободить память 800 КБ. Похоже, что так не получается. ОграниченныйMaxRequestPerChild
помогает предотвратить утечку памяти, создавая новый процесс после ограниченногоMaxRequestPerChild
, и старый процесс умирает. Это моя новая настройка.ThreadsPerChild 1500 MaxRequestsPerChild 10000
-
ob_flush();
уменьшает немного больше памяти. Это не помогает, но каждый бит оптимизации помогает. - Я использовал
xdebug
, который я никогда раньше не использовал, как предполагают люди, которые пытаются ответить на этот вопрос. Я должен сказать, что это отличный инструмент, и я оптимизировал несколько продуктов, чтобы заставить его работать немного быстрее. - Я отключил несколько ненужных модулей Apache. Я пытаюсь отключить его один за другим и оставьте его на несколько дней, чтобы убедиться, что он работает отлично, прежде чем отключить другой. У меня теперь все ненужное расширение PHP.
- Большинство моих script на этом сервере использовали традиционный способ (без шаблона, без уровня базы данных, чистого PHP, HTML и устаревшей функции mysql_ *). Честно говоря, он работает очень быстро и использует чрезвычайно маленькую память. Тем не менее, обслуживание script не очень просто, так как веб-сайт становится дольше. Я попытался преобразовать некоторые части веб-сайта в правильную структуру (моя собственная крошечная структура). Причина, по которой я использовал свою собственную структуру, потому что она крошечная (3kb для всей структуры и включает только то, что мне нужно).
- Переключение на IIS7.5 полностью решение этой проблемы.