PHP + Shell = ♥ 
Макс Волошин, PUG Dnepr #2
О чём рассказ? 
● работа в Shell 
● исполнение PHP в Shell 
● использование REPL 
● сравнение Boris и PsySH
Зачем нам это? 
Мы работаем с Shell когда 
● используем эмулятор терминала: 
iTerm / Gnome Terminal / Konsole / xterm / ... 
● заходим по ssh на удалённую машину 
● используем PHP функции: 
/ / / / ... 
● предоставляем интерфейс командной строки к 
своему приложению 
● ...
Что такое Shell? 
Shell – интерпретатор командного языка, 
который определяется стандартом POSIX
Что такое Shell? 
Существуют различные реализации Shell 
● оригинальный Bourne Shell – sh – используется в 
большинстве версий UNIX 
● Bourne Again Shell – bash – используется во многих 
дистрибутивах Linux 
● Debian Almquist Shell – dash – используется в Debian 
● Z Shell – zsh – используется продвинутыми 
пользователями командной строки :) 
● ...
Запуск PHP приложения из Shell
Shell переменные и окружение 
В Shell можно использовать переменные
Переменные окружения 
Узнать набор текущих переменных окружения
Переменные окружения 
Превратить простую переменную в переменную 
окружения 
…
Переменные окружения 
Индивидуальные переменные для новой команды 
…
Передача параметров из Shell в PHP
Использование переменных окружения
Использование аргументов вызова
Запуск приложения в POSIX стиле 
↓
Запуск приложения в POSIX стиле 
… 
(никто не имеет права исполнять файл) 
… 
(владелец имеет право исполнить файл)
Запуск приложения в POSIX стиле 
→
Запуск приложения в POSIX стиле
Потоки ввода/вывода/ошибок 
STDIN App 
STDOUT 
STDERR
Работа с потоком вывода
Работа с потоком ошибок
Работа с потоком ошибок
Работа с потоком ввода
Работа с потоком ввода
Работа с потоком ввода без блокировки
Работа с потоком ввода без блокировки
Композиция Shell программ
Последовательное выполнение
Успешность выполнения
Условное выполнение
Pipeline выполнение
REPL – read-eval-print loop
Зачем нам это? 
Чтобы быстро узнать результат одного или нескольких 
выражений 
● вы изучаете язык 
● вы вспоминаете язык 
● вы проверяете знание языка
Пример из жизни PHP разработчика
REPL в PHP 
– возможность исполнять код из аргумента без тегов: 
– запуск в режиме интерактивной среды:
REPL в PHP 
Интерактивная среда не является REPL 
● результат вычисления не выводится 
● при ошибках процесс обрывается 
Выход есть 
● Boris – tiny REPL for PHP 
● PsySH – runtime developer console, interactive 
debugger and REPL for PHP
REPL в PHP
Boris vs PsySH
Boris PsySH 
Статистика 
Первый коммит Nov 6, 2011 Apr 8, 2012 
Звёзды на Github 1 470 + 420 + 
Форки на Github 80 + 30 + 
Загрузок на Packagist за месяц 230 000 + 2 000 +
Установка 
Boris PsySH 
Phar + + 
Composer + +
Boris vs PsySH 
Работа в REPL
Возможность не писать в конце 
Boris PsySH
Возможность не писать в конце 
Boris PsySH
Возможность не писать в конце 
Boris PsySH
Отображение встроенных типов 
Boris PsySH
Отображение встроенных типов 
Boris PsySH
Ограничение глубины вывода 
Boris PsySH
Ограничение глубины вывода 
Boris PsySH
Ограничение глубины вывода 
Boris PsySH
Обработка нефатальных ошибок 
Boris PsySH
Обработка нефатальных ошибок 
Boris PsySH
Обработка нефатальных ошибок 
Boris PsySH
Обработка нефатальных ошибок 
Boris PsySH
Обработка исключений 
Boris PsySH
Обработка исключений 
Boris PsySH
Обработка бесконечных циклов 
Boris PsySH
Обработка бесконечных циклов 
Boris PsySH
Обработка бесконечных циклов 
Boris PsySH
Обработка бесконечных циклов 
Boris PsySH
Обработка бесконечных циклов 
Boris PsySH
Boris vs PsySH 
Внешняя конфигурация
Файл конфигурации 
Boris PsySH
Файл конфигурации 
Boris PsySH
Файл конфигурации 
Boris PsySH
Подключение индивидуальных файлов 
Boris PsySH
Подключение индивидуальных файлов 
Boris PsySH
Boris vs PsySH 
Интеграция со своим приложением
Зачем нам это? 
Чтобы понизить порог входа 
в разрабатываемую систему
Какие возможности REPL нам нужны? 
● создание своей точки входа 
● использование своих переменных 
● написание своих обработчиков для значений
Своя точка входа 
Boris PsySH
Своя точка входа 
Boris PsySH
Своя точка входа 
Boris PsySH
Свои переменные 
Boris PsySH
Свои переменные 
Boris PsySH
Свои переменные 
Boris PsySH
Свой обработчик значений 
Boris PsySH
Свой обработчик значений 
Boris PsySH
Свой обработчик значений
Свой обработчик значений 
Boris PsySH
Свой обработчик значений 
Boris PsySH
Свой обработчик значений 
Boris
Свой обработчик значений 
Boris
Свой обработчик значений 
Boris PsySH
Свой обработчик значений 
PsySH
Свой обработчик значений 
PsySH
Свой обработчик значений 
Boris PsySH
Несколько обработчиков 
Boris PsySH
Несколько обработчиков 
Boris PsySH
Boris PsySH 
принимает массив 
Несколько обработчиков
Рекурсивность обработчиков 
Boris PsySH
Рекурсивность обработчиков 
Boris PsySH
Рекурсивность обработчиков 
Boris PsySH
Итого 
Boris : PsySH 
… кроме этого в PsySH еще много всего хорошего 
http://psysh.org/
Спасибо! maxvoloshin.com

Макс Волошин: Php + shell = ♥