如何从命令行执行 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 代码?的主要内容,如果未能解决你的问题,请参考以下文章

DEVC++如何使用命令行,为命令行参数赋值?

如何通过Linux命令行使用和运行PHP脚本

通过命令行执行用 ZendGuard 编码的 PHP 脚本

PHP命令行执行文件或代码

如何从命令行下载站点中的文件,用php编写文件

命令行运行PHP文件时如何传递参数?