Я часто нахожу интерактивный режим php -a
– php -a
– очень полезен, но было бы гораздо полезнее, если бы я мог запустить его и сразу же запустить несколько команд для инициализации моей среды. Такие вещи, как запустить автозагрузчик, настроить несколько ярлыков для пространств имен и т. Д.
Вот пример:
include "../../autoloader.php"; use App/Foo/Bar as Bar;
Я думал, может быть, я мог бы просто добавить эти строки в текстовый файл initialize.txt
а затем запустить интерактивный режим с php -a < initialize.txt
но это не сработало.
Кто-нибудь знает, как это сделать?
Как отметил Томас Кремерс, вы должны использовать флаг auto_prepend_file PHP для автоматического запроса файла. Например:
<?php # foo.php function bar() { print "Bar.\n"; }
Вы можете загрузить PHP-интерпретатор следующим образом:
[hron@merlin tmp ] $ php -d auto_prepend_file=$PWD/foo.php -a Interactive shell php > bar(); Bar. php >
Или вы можете включить файл вручную:
[hron@merlin tmp ] $ php -a Interactive shell php > include 'foo.php'; php > bar(); Bar. php >
Вы можете использовать параметр auto_prepend_file
php.ini для указания файла, который должен всегда исполняться перед фактическим файлом.
В соответствии с документацией на интерактивной оболочке этот параметр также активен.
Предполагая, что вы не хотите делать эту инициализацию за каждый раз, когда вы запускаете PHP, я бы предложил создать копию вашего php.ini (например, назвать его «php.ini-interactive») и указать этот файл конфигурации с помощью -c
: php -c /path/to/php.ini-interactive -a
.
(Приложил эту часть после некоторых комментариев по этому вопросу и по самому вопросу).
Согласно комментарию («Ryan P») на странице документации для интерактивной оболочки php -a
, php -a
не всегда делает то же самое:
Интерактивная оболочка и интерактивный режим – это не одно и то же, несмотря на аналогичные имена и функциональные возможности.
Если вы наберете «php -a» и получите ответ «Интерактивная оболочка», за которым следует приглашение «php>», у вас есть доступная интерактивная оболочка (PHP был скомпилирован с поддержкой readline). Если вместо этого вы получите ответ «Интерактивный режим включен», у вас НЕ имеется интерактивная оболочка, и эта статья не применима к вам.
Вы также можете проверить «php -m» и посмотреть, есть ли в выводе readline – если нет, у вас нет интерактивной оболочки.
Интерактивный режим по существу похож на запуск php с stdin в качестве входного файла. Вы просто набираете код, и когда вы закончите (Ctrl-D), php выполняет все, что вы набрали, как если бы это был обычный файл PHP (PHTML), поэтому вы начинаете в интерактивном режиме с '
У меня нет копии PHP с доступной интерактивной оболочкой . По-видимому, у меня есть только интерактивный режим . Я протестировал (см. Ниже) и могу подтвердить, что файлы, настроенные с помощью auto_prepend_file
, выполняются в интерактивном режиме . Однако вы можете захотеть пересмотреть его использование, если у вас появятся те же симптомы, что и у меня:
tomas@debianvm:~$ cat /tmp/prepend.php <?php echo 'cookies are people too!'; tomas@debianvm:~$ grep auto_prepend_file /etc/php5/cli/php.ini auto_prepend_file = tomas@debianvm:~$ grep auto_prepend_file /etc/php5/cli/php.ini-interactive auto_prepend_file = /tmp/prepend.php tomas@debianvm:~$ php -a Interactive mode enabled tomas@debianvm:~$ php -c /etc/php5/cli/php.ini-interactive -a Interactive mode enabled cookies are people too! Segmentation fault tomas@debianvm:~$ php --version PHP 5.4.4-14+deb7u2 (cli) (built: Jun 5 2013 07:56:44) Copyright (c) 1997-2012 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
(Ввод клавиатуры в этом последнем запуске интерактивного режима – это только возврат, за которым следует ctrl-d.)