Быдлокодеры хреновы :-(
Почему так трудно проверять входные данные?
Возился сейчас с расширением Memcache; после очередного изменения кода сервер ушёл в глухую защиту и отказался реагировать на внешние раздражители.
Лог Apache пестрил записями [error] child died with signal 11, в логах ядра было сказано, что PHP было очень плохо:
Mar 27 09:35:02 snowboarding kernel: [509707.070086] php5[870]: segfault at 7f58775f7190 ip 00007f58775f7190 sp 00007f587691f0e8 error 14 in librt-2.10.1.so[7f587b60e000+7000]
Причём PHP мог вызвать сегфолт в любой библиотеке, что придавало охоте на баг особую пикантность. К счастью, откат кода помог локализовать баг.
Ошибка сегментации вызывалась следующим кодом:
$result = false;
if (!empty($data['server'])) {
foreach ($data['server'] as $x) {
$result |= $this->memcache->addServer($x['h'], $x['p'], true, $x['w']);
}
}
Опытным путём было установлено, что когда $x['w'] (вероятность выбора данного сервера) равна нулю, PHP вылетал с ошибкой сегментации при первом же вызове Memcache::get() (кстати, при отрицательном значении веса выдаётся предупреждение и PHP остаётся жив). Не поленились разработчики проверить на отрицательное значение. Но почему проверку на ноль не реализовали? Могли бы хотя бы указать допустимый диапазон значений. Козлы
Буду пробовать вместо Memcache расширение Memcached — надеюсь, что там есть нормальная проверка на ошибки.
Мораль наступающим на те же грабли: данные нужно проверять. А то результату можно не обрадоваться.
Update: bug report.
Автор: Vladimir; опубликовано в: PHP; метки: Memcache, Memcached, PHP, segfault, ошибкаМар
2010
Комментарии к статье «Быдлокодеры хреновы :-(» (5) »
Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.
Оставить комментарий к записи «Быдлокодеры хреновы :-(»
गते गते पारगते पारसंगते बोधि स्वाहा
Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.


Как определил откуда валится php? У меня похожая ситуация – php уходит в segfault, но могу найти откуда…
Ну в моём случае всё просто: PHP стал сегфолтиться после замены одного куска кода другим.
Если по-хорошему, нужно включить core dumps, установить отладочные символы, ждать, пока упадёт, затем натравить
gdbна полученную корку и сделать backtrace.Да, бывает из-за одной мелочи (которую надо найти иногда в нескольких сотнях кода) все проблемы. И самое сложное – отловить эту мелочь. А когда она не по твоей вине – то вообще караул. Руки оторвать хочется…
Memcached действительно, на мой взгляд стабильней… Единственное, что для меня до сих пор остаётся загадкой, где close()??? А так ей очень доволен…
В смысле где
close()?Делаете
unset()переменной-экземпляру класса Memcached, вызовется деструктор класса и, если соединение не persistent, оно будет закрыто.Как-то так.