При отладке софтины, которую я невозбранно программирую в данный момент, столкнулся с таким вот неприятным Fatal error:
Base lambda function for closure not found
Гуглится быстро, но на память записываю.
1. Когда происходит
Происходит при подключении конфига, возвращающего массив, внутри которого в одном из индексов сидит анонимная функция. Примерно так:
<?
return array(
'install' => function() {
// do smth
}
);
Что важно, этот конфиг за один прогон скрипта подключается более одного раза (не спрашивайте зачем, если в двух словах - это повторяющаяся часть нескольких разных конфигов).
2. Из-за чего происходит
Это бага где-то в недрах APC. В увлекательном треде про этот баг есть комменты, примерно описывающие механику. Конкретно у меня APC 3.1.13, то есть последняя бета с PECL.
3. Как лечить на уровне окружения
В конце увлекательного треда по ссылке выше в конце появляется патч. Проблема в том, что он появляется на пару месяцев позже даты последнего релиза (который у меня).
Соответственно, можно выполнить упражнение для красноглазых ниндзя, забрав актуальные исходники git.php.net, где есть вожделенный фикс - но мне как-то не хочется.
Кроме того, в обсуждении баги предлагают выставить настройку apc.write-lock = Off. Учитывая, что баг воспроизводится очень через раз, не готов проверять.
4. Как лечить на уровне кода
Поскольку окружение у меня очень непредсказуемое, придется что-то делать с кодом.
Очевидно, надо не допускать ситуации, когда файл, в котором определяется лямбда, подключается больше одного раза. Чтобы совсем не лишиться возможности использовать удобную технику $cfg = include 'cfg.php', я наверное тупо избавлюсь от анонимных функций, переложив их объявление в отдельный файл. Примерно так:
<?
require_once('install_callback.php');
return array(
'install' => 'my_module_install_callback'
);
Всем привет :)