Наверное, многие сталкивались с вопросом неработающей интерактивной консоли PHP.
Когда вводишь
и видишь только надпись «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
Пакеты php, libedit, libreadline если не были установлены до этого, установятся автоматически.
2. Далее нам понадобятся исходники PHP. Берём их из репозитория ОС
3. Пересобирать весь PHP мы не будем. нам нужен всего лишь один модуль. Его и соберём
4. Здесь нас ожидает подводный камень: при компиляции компилятор не найдёт sapi.h
5. Сборка успешно завершилась. Берём новоиспечённый модуль readline.so, кладём его к модулям действующего PHP и правим конфиги
Модуль:
Здесь команда locate используется для определения пути, где лежат PHP-шные либы на примере mcrypt, который устанавливается автоматом при установке PHP. Если у вас нет команды locate, определите ваш путь по аналогии с моим
Конфиг:
Всё. Консоль работает.
Когда вводишь
# 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 enabled
php >