память — странная проблема с сериализацией после обновления до PHP 5.5, максимальная глубина циклической ссылки?

У меня довольно большой граф с циклическими ссылками в памяти PHP.
Я сериализировал весь график, чтобы хранить его между запросами.
Он хорошо работал на PHP5.3, но теперь я обновился до PHP5.5, и происходит нечто странное:

PHP / Apache аварийно завершает работу / завершается во время сериализации и показов Chrome ERR_CONNECTION_RESET В журнале де PHP нет ошибок и нет ничего в журнале Apache в режиме отладки.

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

не проблема с памятью

Я установил очень высокий предел памяти: memory_limit = 2048Mи как раз перед тем, как я представлю данные, которые его сбивают memory_get_usage() дает 26М и memory_get_peak_usage() дает 41M, так что остается много.

не проблема времени

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

слишком много циклических ссылок / циклов?

Представленные мною данные, приводящие к сбою, не делают ничего особенного с точки зрения объектов. Это все те же объекты PHP (узлы и края для простоты). Кроме того, отношения, непосредственно окружающие объект, который я представляю, не говорят мне ничего странного. Одна вещь, о которой я думаю, это то, что, как только вводятся «проблемные» данные, способ, которым алгоритм сериализации проходит через все изменения объектов, изменяя путь обхода и вызывая сбой чего-либо, потому что … слишком глубоко нужен?

какая-то другая верхняя граница?

другая вещь, о которой я могу подумать, это то, что есть какой-то другой верхний предел, которого я достиг. Дело в том, что, как только я нашел «проблемный» фрагмент данных, который я не могу включить без сбоев, я Можно включите его снова, если я сначала выключу некоторые другие части. Так что это, похоже, не указывает на данные вообще. Но какой предел? Максимальная длина строки, которую я смог выдавить, составляет 5,517,365 символов, что немного больше 5 МБ в соответствии с mb_strlen($string, '8bit'), Но иногда длина строки составляет около 4 миллионов символов, и когда я добавляю немного назад, она вылетает. Это все еще может означать, что этот маленький кусочек данных заставил некоторые более глубокие / большие части графика быть сериализованными раньше, таким образом внутренне достигнув той же верхней границы чего-либо?

Использует ли serialize () что-то вроде буфера или tmp-файла, или он просто использует «обычную память»?

Любая идея, какие другие границы я мог бы достичь? и / или какие настройки могут это решить?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …