В продолжении разговора о патче в php хочется еще рассказать о наших небольших патчах в pecl-memcached. Это pecl модуль, который реализует интерфейс libmemcached в php и добавляет handler сессий для хранения их в memcached.
Первый патч довольно простой, он добавляет нормальные сообщения об ошибках в код handler-а сессий. До этого патча невозможно было понять, то-ли сессии в мемкеше нет, то-ли отвалилась коннекция от мемкеша, то-ли что-то еще произошло. Во всех случаях код возвращал FAILURE и было непонятно, что на самом деле произошло. Аналогично, при сохранении сессии старый код просто увеличивал количество неудачных попыток и при достижении максимума выкидывал сервер из пула по непонятным снаружи причинам.
Второй патч немного интересней. У pecl-memcached было два синтаксиса для конфигурации серверов для хранения сессий (в php 7 уже не так). Первый:
tcp://192.168.0.2:11211?persistent=1,tcp://192.168.0.3:11211?persistent=1
И второй:
PERSISTENT=pool --SERVER=192.168.0.2:11211 --SERVER=192.168.0.3:11211
Так вот, если пользоваться вторым синтаксисом, то игнорировалась ini-переменная memcached.sess_prefix. Мы решили перейти на второй синтаксис, чтобы использовать такой-же persistent_id, что и в конструкторе, и из-за этого бага потеряли все текущие сессии. Хорошо, что нашли этот баг еще в тестовой среде.
Мы столкнулись с этими проблемами, когда в рамках кампании по оптимизации tcp на наших серверах перешли на persistent соединение с memcached. В результате всех работ мы уменьшили среднее время выполнения php на несколько миллисекунд. Очень рекомендую.