Наверное, многие сталкивались с вопросом неработающей интерактивной консоли PHP.
Когда вводишь
# php -a
и видишь только надпись «Interactive mode enabled», после которой что ни вводи, интерпретация и исполнение введённых команд не работает. На самом деле это не совсем так. На самом деле это специальный режим, которым надо ещё уметь пользоваться. Описание работы данного режима не входит в задачи моего поста. Для обычного же непосвящённого пользователя он выглядит именно так: ничего не работает. А вот тем, чтобы «работало» так, как мы привыкли в консолях python или node.js, мы и займёмся.
После некоторого гугления большинство ссылок выдают совет перекомпилировать PHP с поддержкой библиотеки readline. Именно она, дескать, отвечает за работу PHP в интерактивном режиме. Да, именно так: в вашей сборке PHP не работает readline. Боле того, в Debian Linux вы никак не сможете установить эту поддержку «из коробки» из-за проблем лицензионного характера дистрибьютора. Пакета php5-readline в нём просто нет. Тем не менее, есть более простой и «легальный» способ заставить PHP-шную консоль работать, нежели пересборка всего PHP и его «ручная» установка, после которой ваш PHP выпадает из стандартного механизма обновлений операционной системы, а в случае последующей случайной установки PHP из пакета чреват конфликтами.
Сразу оговорюсь, что всё сказанное относится к текущей стабильной версии Debian Wheezy. В следующей, нестабильной версии Debian, эту поддержку вроде как вернули. К сожалению, сам я это не проверял, но видел пакет php5-readline в соответствующем репозитории и видел заключения fixed в соответствующих топиках баг-репортов. То есть, насколько я понял, в Debian Jessie и PHP 5.5 эта поддержка будет «из коробки».
Вернёмся к Wheezy и PHP 5.4…
Написанное с некоторыми небольшими модификациями вполне применимо и к другим дистрибутивам Linux, принцип тот же.
Делаем всё из под рута либо предваряем командой sudo.
1. Прежде всего нам понадобятся пакеты dev для PHP и readline
# aptitude install php5-dev libedit-dev libreadline-dev
Пакеты php, libedit, libreadline если не были установлены до этого, установятся автоматически.
2. Далее нам понадобятся исходники PHP. Берём их из репозитория ОС
# apt-get source php5-cli
3. Пересобирать весь PHP мы не будем. нам нужен всего лишь один модуль. Его и соберём
# cd php5-5.4.4/ext/readline/
# phpize
# ./configure
# make
4. Здесь нас ожидает подводный камень: при компиляции компилятор не найдёт sapi.h
# ln -s ../../sapi/
# make
5. Сборка успешно завершилась. Берём новоиспечённый модуль readline.so, кладём его к модулям действующего PHP и правим конфиги
Модуль:
# locate mcrypt.so | grep php
# cp modules/readline.so /usr/lib/php5/20100525+lfs/
# chmod -x /usr/lib/php5/20100525+lfs/readline.so
Здесь команда locate используется для определения пути, где лежат PHP-шные либы на примере mcrypt, который устанавливается автоматом при установке PHP. Если у вас нет команды locate, определите ваш путь по аналогии с моим
Конфиг:
# echo 'extension=readline.so' >/etc/php5/mods-available/readline.ini
# cd /etc/php5/cli/conf.d
# ln -s ../mods-available/readline.ini 20-readline.ini
Всё. Консоль работает.
# php -a
Interactive mode enabledphp >
Автор: TheRoSS