Pull to refresh

Интерактивная консоль PHP

Reading time 2 min
Views 7K
Идея этого лежит на поверхности, но почти все, кому я показывал эту штуку, удивлялись и просили дать им ссылку. Хотя идея простая, а про stdin и readline знают почти наверное все.

Так вот, интерактивная консоль — это просто и очень полезно. С историей и автодополнением.

такие дела

Есть, однако, три вопроса и две проблемы.

1) windows. В windows никакого readline нет, нет, соответственно, и автокомплита. Только stdin. Для него враппер написан, но esc-последовательности смены цвета, к сожалению, не работают (но нужно это просто пофиксить).

2) readline+libedit/libreadline. Их нужно (желательно, вернее) установить. Последняя библиотека и может у вас уже стоять (если нет — то у меня она установилась по команде «emerge libedit»), то php-расширение readline нужно собрать. Делается это примерно так: cd php-5.x.x/ext/readline && phpize && ./configure && make && make install

3) libedit мне лично пришлось настраивать. Файл ~/.editrc выглядит у меня как-то так:

bind "^R" em-inc-search-prev
bind "^[O5C" vi-next-word
bind "^[O5D" vi-prev-word
bind "^[[1~" ed-move-to-beg
bind "^[[4~" ed-move-to-end
bind "^[[3~" ed-delete-next-char


Теперь о проблемах. Первая заключается в том, что код, находящийся внутри eval'а, можно контролировать на parse error, но на fatal error — нельзя. Соответственно, при фатальных ошибках валится вся консоль. Справедливости ради скажу, что у меня fatal error выпадала всего пару раз, большинство ошибок — или notice, или parse error.

Вторая проблема — это кривое расширение readline, которое не принимает ответ «нет вариантов» от функции автокомплита. Я не смог это побороть, и теперь, если нажать Tab сразу же или после пробела, без ввода символа, то будет выводиться список файлов, а это иногда мешает.
Но в целом такая консоль довольно полезна.

Исходники лежат на гуглокоде, прошу.

PS (для тех кому скучно): что выведет строка for ($i='a';$i<='z';$i++) echo $i.' ';?
Tags:
Hubs:
+55
Comments 88
Comments Comments 88

Articles