Я думаю, что мог найти ошибку в функции PHP crypt()
под Windows.
Однако : я понимаю, что это, вероятно, моя вина .PHP используется миллионами и работает тысячами;мой код используется десятками и работает над мной.(Этот аргумент лучше всего объяснил в Coding Horror .)
Поэтому я прошу помощи: покажи мне свою ошибку. Я пытался ее найтив течение нескольких дней безуспешно.
Настройка
Я использую установку Windows-сервера с Apache 2.2.14 (Win32) и PHP 5.3.2.Моя коробка разработки работает под управлением Windows XP Professional;«рабочий» сервер (это настройка интрасети) работает под управлением Windows Storage Server 2003. Проблема возникает в обоих случаях.
Я не вижу ничего в php.ini
, связанного с crypt()
, но с радостью отвечувопросы о моем конфиге.
Проблема
Иногда в моем PHP-приложении иногда зависают несколько скриптов: страница находится в ожидании localhost и никогда не заканчивается.Каждый из этих сценариев использует crypt
для хеширования пароля пользователя перед его сохранением в базе данных или, в случае страницы входа, для хеширования введенного пароля перед сравнением его с версией, хранящейся в базе данных.
Поскольку страница входа в систему является самой простой, я сосредоточился на ней для тестирования.Я неоднократно входил в систему и обнаружил, что он может зависнуть, возможно, 4 раза из 10.
В качестве эксперимента я изменил страницу входа, чтобы использовать простой текстовый пароль, и изменил свой пароль в базе данных на обычный текст.версия.Страница перестала зависать.
Я видел, что в последней версии PHP есть это исправление:
Исправлена ошибка # 51059 (крипта вылетает, когда заданы недопустимые соли).
Итак, я создал очень простой тестовый скрипт, используя следующую соль, приведенную в официальном примере :
$foo = crypt('rasmuslerdorf','r1');
echo $foo;
Эта страница тоже будет зависать, если я перезагрузить его, как сумасшедший.Я только вижу он зависает в Chrome, но независимо от браузера, эффект на Apache одинаков.
Эффект на Apache
Когда эти страницы зависают, Apache страница состояния сервера (которую я объяснил здесь относительно другой проблемы) увеличивает количество обрабатываемых запросов и уменьшает число неработающих работников.Почти все обрабатываемые запросы имеют статус «Отправка ответа», хотя иногда на мгновение они показывают либо «Запрос на чтение», либо «Keepalive (чтение)».
В конце концов, Apache может аварийно завершить работу.Когда это произойдет, отчет о сбое Windows будет выглядеть так:
szAppName: httpd.exe
szAppVer: 2.2.14.0
szModName: php5ts.dll
szModVer: 5.3.1.0 // OK, this report was before I upgraded to PHP 5.3.2,
// but that didn't fix it
offset: 00a2615
Это моя вина?
Я испытываю желание подать отчет об ошибке в PHP по этому поводу.Аргумент против этого заключается в том, что, как указано выше, ошибки почти всегда являются моей ошибкой.
Тем не менее, мой аргумент в пользу «это ошибка PHP»:
- Я использую Windows, в то время как большинство серверов используют Linux (я не могу выбрать это), поэтому больше шансов, что я нашел крайний случай
- Недавно была ошибка с
crypt()
, так что, возможно, у него все еще есть проблемы - Я сделал простейший тестовый пример, который могу, и у меня все еще есть проблема
Может кто-нибудь повторить это? Можете ли вы подсказать, где я ошибся?Должен ли я сообщать об ошибке в конце концов?
Заранее благодарим за любую помощь, которую вы можете оказать.