初始化PHP交互式

ki1q1bka  于 2023-01-04  发布在  PHP
关注(0)|答案(2)|浏览(188)

我经常发现PHP的交互模式-php -a-非常有用,但是如果我能启动它并立即执行一些命令来初始化我的环境,比如运行autoloader,为名称空间设置一些use快捷方式,等等,它会更有用。
下面是一个例子:

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

我想也许我可以把这些行添加到一个文本文件initialize.txt中,然后用php -a < initialize.txt启动交互模式,但是没有用。
我该怎么做呢?

e4eetjau

e4eetjau1#

正如Tomas Creemers提到的,你必须使用auto_prepend_file PHP标志来自动请求一个文件。

<?php
    # foo.php
    function bar() { print "Bar.\n"; }

你可以像这样加载PHP解释器:

php -d auto_prepend_file=$PWD/foo.php -a

会议:

Interactive shell

php > bar();
Bar.

也可以手动包含文件:

php -a

会议:

Interactive shell

php > include 'foo.php';
php > bar();
Bar.
evrscar2

evrscar22#

您可以使用 * 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文档页面上的一条评论(作者"Ryan P"),php -a并不总是做同样的事情:
交互式 shell 和交互式模式不是一回事,尽管名称和功能相似。
如果你输入'php-a',得到的响应是'Interactive Shell',后面跟着'php〉'提示符,那么你就可以使用交互式环境了(PHP编译时支持readline);如果你得到的响应是'Interactive mode enabled',那么你就不能使用交互式环境,这篇文章对你不适用。
你也可以检查'php-m',看看输出中是否列出readline--如果没有,你就没有交互式环境。
交互模式本质上就像运行php,把stdin作为文件输入,你只需要输入代码,当你输入完代码后(Ctrl-D),php就会执行你输入的任何东西,就像它是一个普通的PHP(PHTML)文件一样--因此你可以在交互模式下用'〈?php'开始执行代码。
我没有带交互式 * shell * 的PHP副本。显然,我只有交互式 * 模式 *。我已经测试过(见下文),可以确认使用auto_prepend_file * 配置的文件 * 在交互式 * 模式 * 下执行。但是,如果您遇到与我相同的症状,您可能需要重新考虑使用它:

cat /tmp/prepend.php

输出:

<?php

echo 'cookies are people too!';

此外:

grep auto_prepend_file /etc/php5/cli/php.ini

输出:
一个三个三个一个
输出:

auto_prepend_file = /tmp/prepend.php
php -a

会议:

Interactive mode enabled
php -c /etc/php5/cli/php.ini-interactive -a

输出:

Interactive mode enabled

cookies are people too!
Segmentation fault
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。)

相关问题