sverel
Новичок
Всем привет. Столкнулся с очень не понятной багой. Багу пофиксил, но откуда она взялась - не могу понять.
На локальной машине запущено 2 сайта на одинаковых движках. Вчера вдруг внезапно, один из них перестал работать: браузер стал сообщать "соединение было разорвано сервером". Нет никаких сообщений об ошибках и даже в апачевских error-log и access-log ничего не пишется.
Методом подстановки exit-a было установлено, что скрипт отваливается в этой функции дойдя до самой последней строки с return-ом:
А в последней строке вроде как и ломаться нечему?!
Решение оказалось удивительным. Если поставить пустую строку в любое место функции, то сайт начинает отлично работать. Я поставил пустую строку перед закрывающей фигур.скобкой:
Строка с комментарием тоже помогает. Да и вообще любые изменения в файле помогают.
Как это можно объяснить?
Первая мысль: ошибка php-парсера. Но днём ранее всё отлично работало, в выходные никто сайт не трогал и он вдруг внезапно перестал работать. Кроме того, есть ещё второй сайт с такой же функцией и она отлично отрабатывает без пустых строк. И ещё я пробовал переключать версию php 5.3.8 и 5.3.10 - безрезультатно. Значит, парсер не виновен.
Вторая мысль: проблема с железом; может быть в ОЗУ появились бэды? Запустил на ночь memtest - ошибок не найдено.
Идеи закончились. Что ещё это может быть?
Баг проявлялся на:
Win7x64
Apache 2.2.20
mod_php 5.3.8 и 5.3.10 with xDebug
Оба сайта на Битриксе. Ломающая функция находится в ядре битрикса.
На локальной машине запущено 2 сайта на одинаковых движках. Вчера вдруг внезапно, один из них перестал работать: браузер стал сообщать "соединение было разорвано сервером". Нет никаких сообщений об ошибках и даже в апачевских error-log и access-log ничего не пишется.
Методом подстановки exit-a было установлено, что скрипт отваливается в этой функции дойдя до самой последней строки с return-ом:
PHP:
function MakeComponentPath($componentName)
{
if(!CComponentEngine::CheckComponentName($componentName))
return "";
return "/".str_replace(":", "/", $componentName);
}
Решение оказалось удивительным. Если поставить пустую строку в любое место функции, то сайт начинает отлично работать. Я поставил пустую строку перед закрывающей фигур.скобкой:
PHP:
function MakeComponentPath($componentName)
{
if(!CComponentEngine::CheckComponentName($componentName))
return "";
return "/".str_replace(":", "/", $componentName);
}
Как это можно объяснить?
Первая мысль: ошибка php-парсера. Но днём ранее всё отлично работало, в выходные никто сайт не трогал и он вдруг внезапно перестал работать. Кроме того, есть ещё второй сайт с такой же функцией и она отлично отрабатывает без пустых строк. И ещё я пробовал переключать версию php 5.3.8 и 5.3.10 - безрезультатно. Значит, парсер не виновен.
Вторая мысль: проблема с железом; может быть в ОЗУ появились бэды? Запустил на ночь memtest - ошибок не найдено.
Идеи закончились. Что ещё это может быть?
Баг проявлялся на:
Win7x64
Apache 2.2.20
mod_php 5.3.8 и 5.3.10 with xDebug
Оба сайта на Битриксе. Ломающая функция находится в ядре битрикса.