【问题标题】:How can I execute PHP code from the command line?如何从命令行执行 PHP 代码?
【发布时间】:2012-03-20 04:14:27
【问题描述】:

我想直接在命令行中执行一条 PHP 语句,例如 if(function_exists("my_func")) echo 'function exists';,而不必使用单独的 PHP 文件。

这怎么可能?

【问题讨论】:

  • 在不使用任何其他包含用户定义函数的文件的情况下执行 function_exists() 不会有多大好处,除了测试 PHP 版本,您可以通过其他方式找到它。你想测试什么功能?
  • 我正在寻找测试这个函数:sg_load()
  • 听起来你真正想要的是找出是否启用了 sourceguardian php 扩展?
  • 那么 phpinfo() 应该会告诉你。

标签: php linux function shell command-line


【解决方案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(在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 设置坏了。我更新了我的答案,包括解决问题的提示。
  • 添加了一个关于 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);

      【讨论】:

        猜你喜欢
        • 2013-09-25
        • 1970-01-01
        • 2010-11-18
        • 2012-07-08
        • 2010-10-29
        • 1970-01-01
        • 1970-01-01
        • 2017-08-08
        • 1970-01-01
        相关资源
        最近更新 更多