如何从命令行执行 PHP 代码?
Posted
技术标签:
【中文标题】如何从命令行执行 PHP 代码?【英文标题】:How can I execute PHP code from the command line? 【发布时间】:2012-03-20 04:14:27 【问题描述】:我想直接在命令行中执行一条 php 语句,例如 if(function_exists("my_func")) echo 'function exists';
,而不必使用单独的 PHP 文件。
这怎么可能?
【问题讨论】:
在不使用任何其他包含用户定义函数的文件的情况下执行 function_exists() 不会有多大好处,除了测试 PHP 版本,您可以通过其他方式找到它。你想测试什么功能? 我正在寻找测试这个函数:sg_load() 听起来你真正想要的是找出是否启用了 sourceguardian php 扩展? 那么 phpinfo() 应该会告诉你。 【参考方案1】:如果你要在命令行中做PHP,我建议你安装phpsh, a decent PHP shell。它更有趣。
无论如何,php
命令提供了两个开关来从命令行执行代码:
-r <code> Run PHP <code> without using script tags <?..?>
-R <code> Run PHP <code> for every input line
你可以像这样使用php
的-r开关:
php -r 'echo function_exists("foo") ? "yes" : "no";'
如您所见,上面的 PHP 命令应该 输出 no
和 返回 0
:
>>> php -r 'echo function_exists("foo") ? "yes" : "no";'
no
>>> echo $? # print the return value of the previous command
0
另一个有趣的开关是php -a:
-a Run as interactive shell
它与phpsh相比有点蹩脚,但如果你不想安装the awesome interactive shell for PHP made by Facebook to get tab completion, history, and so on,那么使用-a:
>>> php -a
Interactive shell
php > echo function_exists("foo") ? "yes" : "no";
no
php >
如果它在你的盒子上不起作用,就像在我的盒子上一样es(在Ubuntu 和Arch Linux 上测试),那么可能您的 PHP 设置是模糊的或损坏的。如果你运行这个命令:
php -i | grep 'API'
您应该看到:
Server API => Command Line Interface
如果您不这样做,这意味着可能另一个命令将提供 CLI SAPI。试试 php-cli;也许它是您操作系统中可用的包或命令。
如果你这样做看到你的 php
命令使用 CLI(命令行界面)SAPI(服务器 API),然后运行 php -h | grep code
以 找出哪个疯狂的开关 -因为这一年没有改变 - 允许在您的版本/设置中运行代码。
另外几个例子,只是为了确保它适用于我的盒子:
>>> php -r 'echo function_exists("sg_load") ? "yes" : "no";'
no
>>> php -r 'echo function_exists("print_r") ? "yes" : "no";'
yes
另外,请注意,扩展可能是在 CLI 中而不是在 CGI 或 Apache SAPI 中加载的。 很可能几个 PHP SAPI 使用不同的 php.ini 文件,例如,Gentoo Linux 框上的 /etc/php/cli/php.ini
与 /etc/php/cgi/php.ini
与 /etc/php/apache/php.ini
。找出与php -i | grep ini
一起使用的ini 文件。
【讨论】:
可能你的 php 设置坏了。我更新了我的答案,包括解决问题的提示。 添加了一个关于 php -a 的注释,它可能对你有用。 请注意,phpsh 不再由其作者 (Facebook) 和 Google 群组页面 said in 2012 that "phpsh isn't really supported or useful any more" 上的某个人维护。您可以查看Boris REPL 以获得改进的 php 控制台。 最简单的方法是php -a
我已经添加了一张图片并在下面写了一个答案
"-r" 行的单引号在 Windows 上不起作用(?)。【参考方案2】:
在命令行上:
php -i | grep sourceguardian
如果它在那里,那么你会得到一些文本。否则,您将一无所获。
【讨论】:
要么我是盲人,要么这个答案与问题无关。这个答案应该如何回答问题“如何直接从命令行运行 PHP 代码,而不将 PHP 代码保存到.php
文件中?”?
@trejder 有那么一会儿我想知道我是否回答错了问题,但随后我查看了编辑历史记录和 cmets。这回答了 OP 似乎真正需要的东西:找出是否加载了特定的 PHP 扩展。这个问题后来被改写了,所以现在不太合适。【参考方案3】:
你可以使用:
echo '<?php if(function_exists("my_func")) echo "function exists"; ' | php
短标签“”也很有帮助:
echo '<?= function_exists("foo") ? "yes" : "no";' | php
echo '<?= 8+7+9 ;' | php
结束标记“?>”是可选的,但不要忘记最后的“;”!
【讨论】:
这似乎比 7 岁接受的答案更麻烦。使用php -r
,您无需担心打开 PHP 标签。【参考方案4】:
Using PHP from the command line
在使用带有-r
的CLI 版本时,在Windows 上使用"
而不是'
:
正确
php -r "echo 1;"
不正确
php -r 'echo 1;'
PHP Parse error: syntax error, unexpected ''echo' (T_ENCAPSED_AND_WHITESPACE), expecting end of file in Command line code on line 1
不要忘记分号关闭行(否则,结果是 “PHP Parse error: syntax error, unexpected end of file, expecting ';' or ',' in Command line code on line 1 ")。
【讨论】:
【参考方案5】:如果你使用 Laravel,你可以使用 php artisan tinker
来获得一个惊人的交互式 shell 来与你的 Laravel 应用程序交互。然而,Tinker 在底层使用“Psysh”,即a popular PHP REPL,即使你不使用 Laravel(裸 PHP)也可以使用它:
// Bare PHP:
>>> preg_match("/hell/", "hello");
=> 1
// Laravel Stuff:
>>> Str::slug("How to get the job done?!!?!", "_");
=> "how_to_get_the_job_done"
我非常喜欢Psysh 的一个很棒的功能是它提供了一种从命令行直接查找 PHP 文档的快捷方式。要使其正常工作,您只需执行以下简单步骤:
apt install php-sqlite3
然后获取所需的PHP文档数据库并将其移动到适当的位置:
wget http://psysh.org/manual/en/php_manual.sqlite
mkdir -p /usr/local/share/psysh/ && mv php_manual.sqlite /usr/local/share/psysh/
现在举例:
【讨论】:
【参考方案6】:通过 Windows 命令运行 PHP shell:
php -a
它将在 Windows 中打开下面的 PHP shell,我在其中测试了一个简单的 square_val()
函数:
function square_val($num, $pow)
return $num**$pow;
上面的代码已经测试过了。
要测试上述代码是否有效,请使用echo square_val(4, 2);
,然后使用echo square_val(4, 0.5);
。
【讨论】:
以上是关于如何从命令行执行 PHP 代码?的主要内容,如果未能解决你的问题,请参考以下文章