PHP 5.2.12 → PHP 5.3.1

Поставил новый «Денвер» с PHP 5.3.1 (до этого версия была 5.2.12), сразу же поймал баг — одна из программулин, которую я тихонечко пишу в свободное время стала подвисать вместе с интерпретатором при определённых условиях.

Прокрутив код в голове, я понял, что есть одно место в коде, которое вызывает у меня сомнение — блокировка (flock) файла, убрал обе блокировки, код заработал. Развернул по памяти всю объектную структура проекта, понял, что основной объект, который является точкой доступа к файлам создаётся два раза, у меня забрезжило смутное подозрение. Переделал основную точку входа в обработку файлов на синглетоны. Заработало как часы.

Я не уверен, потому что вполне могу что-то не улавливать, но в 5.3.x изменился сборщик мусора и, похоже, некоторые объекты стали жить (охохо) дольше. Блокировка файла у меня снимается в деструкторе объектной обёртки над файлом, да так, что могла вызвать теоритический dead lock, если объект не сдохнет вовремя. Что ж, завязываться на такие особенности интерпретатора неправильно, но PHP меня совершеннейше расслабляет тем, что для него в природе существует ровно один интерпретатор, да и такие серьёзные изменения в нём происходили давненько.

В общем, не ждите, что миграция при смене версии на 5.3 гарантированно произойдёт без проблем.

Добавлено 15 февраля 04:21: а ещё у меня 5.3 (под Windows) зависает при использовании функции crypt (алгоритм Blowfish, другие не проверял), не всегда зависает, но если входные данные разнообразны, то рано или поздно это происходит.

2 комментария

Как узнать в каком месте зависла программа на PHP?

PHP 5.3.1 что-то меня разочаровывает. Висит (по крайней мере под Windows XP) в самых неожиданных местах. Кстати, эти зависания подтолкнули меня к поиску способа, которым можно было бы отследить где зависла программа.

Способ проще некуда: ставим модуль PHP xdebug, прописываем его в php.ini (не забываем, что в PHP 5.3 всегда используется «zend_extension»), а в исследуемой программе указываем:

xdebug_start_trace('/какой/то/путь/имя-лога', XDEBUG_TRACE_APPEND);

После зависания идём в указанную папку и смотрим в лог, последняя строка в нём и есть источник зависания.

10 комментариев

JavaScript V8 и nginx

Игорь Сысоев написал интересную статью «Почему Google V8 пока не подходит для встраивания в сервера», краткая выжимка:

Поскольку V8 разрабатывается в первую очередь для Chrome, то это наложило на него существенный отпечаток и, перефразируя высказывание Генри Форда о цвете машины, можно сказать, что V8 будет хорошо работать в любой программе, при условии, что эта программа называется Chrome. (…) Подытоживая вышеописанное, можно сказать, что на данный момент (версия 2.0.6.4, февраль 2010 года) V8 не подходит для серьёзного встраивания в сервера.

Оставить комментарий