PHP 7.2.9 из памяти в случайное время - PullRequest
0 голосов
/ 16 октября 2018

Мы используем Apache (32-разрядный) в Windows в сочетании с PHP 7.2.9.Это работает большую часть времени, но после большого количества обновлений (большое количество - случайное число раз при каждом перезапуске apache), мы получаем эту ошибку: Неустранимая ошибка: Недостаточно памяти (выделено 27262976), попытался выделить 4096 байт в [randomфайл, всегда другой] в строке x.

Странно то, что он выдает ту же самую ошибку, пока мы не перезапускаем Apache, затем он работает в течение пары часов.

Также странноявляется то, что мы устанавливаем 512M в качестве предела памяти в php.ini, но он говорит, что выделено 27262976, что (точно) 26MB.У нас 2 ГБ + ОЗУ свободно, так что это не проблема.

Было бы замечательно, если бы кто-нибудь знал, как решить эту проблему.

Спасибо, Ларс

1 Ответ

0 голосов
/ 16 октября 2018

Скорее всего, память просто фрагментирована.(У меня было подобных проблем раньше.) Вы должны позволить сборке мусора работать больше, пока ваш код работает.

Один из способов сделать это

Вы должны определить часть всего процесса, где вы создаете самые большие массивы или объекты, и разбить его на несколько меньших шагов.Я не знаю, что делает ваш код, но важная часть заключается в том, что PHP выполняет сборку мусора на определенных этапах , например, когда функция возвращается и освобождает свое собственное окружение.Итак, если вы, скажем, обрабатываете 10000 файлов в цикле, было бы полезно реализовать систему очередей, в которую вы помещаете 100 файлов, вызываете функцию для их обработки, а затем продолжаете обрабатывать очередь.Звучит глупо, я знаю, но имеет смысл, если подумать.

Другой способ

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

Последнее средство

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

Надеюсь, что что-то из вышеперечисленного поможет.

...