我经常发现PHP的交互模式 - php -a
- 非常有用,但如果我可以启动它并立即执行一些命令来初始化我的环境,那将会更有用。比如运行自动加载器,为命名空间设置一些use
快捷方式等等。
以下是一个例子:
include "../../autoloader.php";
use App/Foo/Bar as Bar;
我想也许我可以将这些行添加到文本文件initialize.txt
中,然后使用php -a < initialize.txt
启动交互模式,但这不起作用。
任何人都知道怎么做?
答案 0 :(得分:6)
正如Tomas Creemers所提到的,你必须使用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 >
答案 1 :(得分:2)
您可以使用php.ini设置auto_prepend_file
指定一个应该在实际文件之前始终执行的文件。
根据documentation on interactive shell,此设置也在那里有效。
假设您不想每次启动PHP时都进行初始化,我建议您创建一个php.ini的副本(例如将其称为'php.ini-interactive')并指定该配置文件使用-c
选项:php -c /path/to/php.ini-interactive -a
。
(在对这个答案和问题本身的一些评论之后附上这部分。)
根据PHP交互式shell的文档页面上的comment(由“Ryan P”提供),php -a
并不总是做同样的事情:
尽管如此,交互式Shell和交互模式并不是一回事 相似的名称和功能。如果您输入'php -a'并获得'Interactive Shell'的回复 然后是'php&gt;'提示,你有可用的交互式shell(PHP 编译时使用readline支持)。如果相反你得到了回应 '启用交互模式',您没有交互式shell 可用,本文不适用于您。
您还可以检查'php -m',看看是否列出了readline 输出 - 如果没有,则没有交互式shell。
交互模式本质上就像运行带有stdin的php一样 文件输入。你只需输入代码,当你完成(Ctrl-D),php 执行您键入的任何内容,就像它是普通的PHP(PHTML)文件一样 - 因此你开始以''的互动模式
我没有可用的交互式 shell 的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。)