9

我经常发现 PHP 的交互模式php -a非常有用,但如果我可以启动它并立即执行一些命令来初始化我的环境,它会更加有用。诸如运行自动加载器、use为命名空间设置一些快捷方式等。

这是一个例子:

include "../../autoloader.php";
use App/Foo/Bar as Bar;

我想也许我可以将这些行添加到文本文件中initialize.txt,然后启动交互模式,php -a < initialize.txt但这不起作用。

有人知道怎么做吗?

4

2 回答 2

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 > 
于 2013-08-18T23:19:00.927 回答
2

您可以使用 php.ini 设置auto_prepend_file来指定应始终在实际文件之前执行的文件。

根据有关交互式 shell 的文档,此设置在那里也处于活动状态。

假设您不想在每次启动 PHP 时都进行此初始化,我建议您创建 php.ini 的副本(例如,将其称为“php.ini-interactive”)并使用-c选项指定该配置文件: php -c /path/to/php.ini-interactive -a.


(在对此答案和问题本身进行一些评论后附加此部分。)

根据 PHP 交互式 shell 文档页面上的评论(由“Ryan P”撰写),php -a并不总是做同样的事情:

尽管名称和功能相似,但交互外壳和交互模式并不是一回事。

如果您键入“php -a”并得到“Interactive Shell”的响应,然后是“php>”提示符,则您可以使用交互式 shell(PHP 是使用 readline 支持编译的)。相反,如果您收到“已启用交互模式”的响应,则说明您没有可用的交互式 shell,并且本文不适用于您。

您还可以检查“php -m”并查看输出中是否列出了 readline - 如果没有,则说明您没有交互式 shell。

交互模式本质上就像使用标准输入作为文件输入运行 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。)

于 2013-08-18T00:54:03.787 回答