如何在命令行中执行PHP代码?

192
我想在命令行中直接执行一个单独的PHP语句,例如if(function_exists("my_func")) echo 'function exists';,而无需使用单独的PHP文件。这是否可能?

1
如果不使用任何包含用户定义函数的其他文件,仅使用function_exists()函数并没有太大作用,除了测试PHP版本,你可以通过其他方式找到它。你想要测试哪个函数? - Matt Gibson
我正在寻找测试这个函数:sg_load()。 - Steve
2
听起来你真正想知道的是如何找出是否启用了SourceGuardian PHP扩展? - Matt Gibson
3
然后 phpinfo() 应该会告诉你。 - jpic
6个回答

301
如果你想在命令行中使用PHP,我建议你安装一个不错的PHP shell——phpsh。这将会更有趣。
无论如何,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,它有些过时了,但如果您不想安装由Facebook制作的令人惊叹的交互式PHP shell,可获得tab completion、history等功能, 那么可以使用-a

>>> php -a
Interactive shell

php > echo function_exists("foo") ? "yes" : "no";
no
php >

如果您的电脑上不能像我的电脑一样运行(经过UbuntuArch 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设置出了问题。我更新了我的答案,包括提示来解决它。 - jpic
添加了一条关于 php -a 的注释,这可能对您有用。 - jpic
8
请注意,phpsh不再由其作者(Facebook)维护,而2012年Google Groups页面上的某人声称“phpsh不再受支持或有用”。您可以尝试使用Boris REPL来获取更好的PHP控制台体验。 - Ben Creasy
最简单的方法是使用 php -a 命令。我已经添加了一张图片并在下面写了一个答案。 - user15393375
单引号在 Windows 上不能用于“-r”行。 - Peter Mortensen

12

从命令行使用 PHP

在 Windows 上使用 CLI 版本的 -r 参数时,请使用 " 而不是 '

正确

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"的错误信息)。


4

您可以使用:

 echo '<?php if(function_exists("my_func")) echo "function exists"; ' | php

短标签"< ?="也很有用:
 echo '<?= function_exists("foo") ? "yes" : "no";' | php
 echo '<?= 8+7+9 ;' | php

结束标签“?”是可选的,但不要忘记最后的“;”!

3
使用php -r命令,相较于这个7年前的被接受答案来说似乎更加麻烦。不需要担心PHP标签的打开关闭。 - miken32

3

通过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-shell-command-line


3

在命令行中:

php -i | grep sourceguardian

如果存在,则会返回一些文本。如果不存在,则什么也不会得到。

5
要么我瞎了,要么这个答案与问题无关。这个答案如何回答提问“如何直接从命令行运行PHP代码,而不将PHP代码保存到.php文件中?”的问题? - trejder
16
有一瞬间,我想知道自己是否回答了错误的问题,但后来我看了编辑历史和评论。这个回答似乎解决了提问者真正需要的问题:找出某个PHP扩展是否已加载。现在问题已经重新表述,所以它现在不太合适了。 - Matt Gibson

0
如果你正在使用 Laravel,你可以使用 php artisan tinker 来获取一个令人惊叹的交互式 shell,与你的 Laravel 应用程序进行交互。然而,Tinker 在幕后使用的是 "Psysh",它是 一种流行的 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/

现在举个例子:

Enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接