在命令行上执行一个 PHP 代码字符串

我希望能够在命令行上运行一行 PHP 代码,类似于以下选项的工作方式:

perl -e "print 'hi';"
python -c "print 'hi'"
ruby -e "puts 'hi'"

我希望能够做到:

php "echo 'hi';"

我读到有一个 -r选项,可以做我所需要的 php,但它似乎不可用时,我试图使用它。我试过使用 PHP 5.2.13和 PHP 4.4.9,但都没有可用的 -r选项。

我编写了这个脚本(我称之为 run _ php.php)——它可以工作,但我并不是它的超级粉丝,因为我觉得应该有一种更“正确”的方式来完成它。

#!/usr/bin/php5 -q
<?php echo eval($argv[1]); ?>

-r选项吗?如果是这样,为什么当我运行 --help时它不可用?如果没有 -r选项,那么做到这一点的最佳方法是什么(如果可能的话,不需要编写中间脚本) ?


因为我不认为它是非常清楚以上,-r选项是 没有可用于我。下面是我正在运行的两个版本的 PHP 的 php -h输出。

PHP 4.4.9

Usage: php [-q] [-h] [-s] [-v] [-i] [-f <file>]
php <file> [args...]
-a               Run interactively
-C               Do not chdir to the script's directory
-c <path>|<file> Look for php.ini file in this directory
-n               No php.ini file will be used
-d foo[=bar]     Define INI entry foo with value 'bar'
-e               Generate extended information for debugger/profiler
-f <file>        Parse <file>.  Implies `-q'
-h               This help
-i               PHP information
-l               Syntax check only (lint)
-m               Show compiled in modules
-q               Quiet-mode.  Suppress HTTP Header output.
-s               Display colour syntax highlighted source.
-v               Version number
-w               Display source with stripped comments and whitespace.
-z <file>        Load Zend extension <file>.

PHP 5.2.13

Usage: php [-q] [-h] [-s] [-v] [-i] [-f <file>]
php <file> [args...]
-a               Run interactively
-C               Do not chdir to the script's directory
-c <path>|<file> Look for php.ini file in this directory
-n               No php.ini file will be used
-d foo[=bar]     Define INI entry foo with value 'bar'
-e               Generate extended information for debugger/profiler
-f <file>        Parse <file>.  Implies `-q'
-h               This help
-i               PHP information
-l               Syntax check only (lint)
-m               Show compiled in modules
-q               Quiet-mode.  Suppress HTTP Header output.
-s               Display colour syntax highlighted source.
-v               Version number
-w               Display source with stripped comments and whitespace.
-z <file>        Load Zend extension <file>.

没有-r 选项。当我尝试使用 -r选项时,我得到:

参数1错误,char 2: 选项未找到 r

抱歉给你添麻烦了。

92795 次浏览

看看 PHP 命令行特性的这一页,如果你还没有看过的话。有一些关于操作系统和双引号或单引号问题的帖子。

我还要检查 PHP 信息

Php-i

查看 PHP 是否为 禁用 CLI 支持编译(—— disable-cli)。

没错,就在 PHP 5.2的 cli SAPI里。

如果您无法升级,并且在 PHP 5.2中没有这样的选项(我手头没有可以测试的选项) ,那么您可以这样做:

echo "<?php echo \"hi\\n\";" | php


hi

原文:

确实有一个 -r选项(尽管我不确定 PHP 5.2) :

php -r "echo 'hi';";


hi

只要确保您使用的是 PHP 的命令行版本。php --version应该给你这样的东西(注意“ cli”) :

php --version


PHP 5.3.0 (cli) (built: May 20 2010 19:05:12) (DEBUG)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies

结尾不需要额外的分号。

你可以提到 php -r "echo 'hi';"而不是 php -r "echo 'hi';";

另一个示例(在命令行中获取当前时间戳) :

php -r 'print time()."\n";'

在 PHP 的新版本中,只要输入“ PHP-a”,就可以进入交互模式,在那里可以试验 PHP。

最简单的方法是使用 -r标志。但是,我发现它不允许多行输入。为了解决这个问题,你可以这样做:

php -r "passthru(file_get_contents('php://stdin'));"

它允许您从标准输入进行管道输入,如下所示:

echo -n "echo 'test';" | php -r "passthru(file_get_contents('php://stdin'));"

但是,要回答最初的问题,如果您没有 -r标志可用,也可以使用-f 标志-只需传递标准输入作为要打开的文件: php -f /dev/stdin

如果您这样做,请注意: a)您需要在输入的开头包含一个空格,b)您必须用 <?php打开。例如:

echo -ne " <?php\necho 'test';" | php -f /dev/stdin

我最近发现了 ,它是一个交互式调试器,也可以从命令行获得。