execute a string of PHP code on the command line

2019-01-21 08:54发布

I'd like to be able to run a line of PHP code on the command line similar to how the following options work:

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

I'd like to be able to do:

:~> php "echo 'hi';"

I've read that there is a -r option that can do what I need for php, however it doesn't appear to be available when I try to use it. I've tried using PHP 5.2.13 and PHP 4.4.9 and neither have an -r option available.

I wrote this script (that I called run_php.php) - which works, but I'm not a huge fan of it just because I feel like there should be a more "correct" way to do it.

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

My question is: is there a -r option? If so, why is it not available when I run --help? If there is no -r option, what is the best way to do this (without writing an intermediary script if possible)?

Thanks!

=== EDIT ===

Because I don't think it was very clear above, the -r option is NOT available to me. Here is the php -h output for both versions of PHP that I'm running.

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>.

There is NO -r option. When I try to use the -r option I get:

Error in argument 1, char 2: option not found r

Sorry for the confusion.

5条回答
Emotional °昔
2楼-- · 2019-01-21 09:21

Extra Semi colon is not required in the end.

You can mention php -r "echo 'hi';" instead of php -r "echo 'hi';";

Another example(To get current timestamp at command line):

php -r 'print time()."\n";'
查看更多
Luminary・发光体
3楼-- · 2019-01-21 09:32

EDIT2: Yep, it's there in PHP 5.2's cli SAPI.

EDIT: If you cannot upgrade and that's the case that there's no such option in PHP 5.2 (I don't have it at hand to test), you can do this:

glopes@nebm:~$ echo "<?php echo \"hi\\n\";" | php
hi

Original:

There is indeed a -r option (though I'm not sure about PHP 5.2):

D:\>php -r "echo 'hi';";
hi

Just make sure you are using the command line version of PHP. php --version should give you something like this (notice "cli"):

D:\>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
查看更多
可以哭但决不认输i
4楼-- · 2019-01-21 09:34

Take a look at this page on PHP command line features, if you haven't already. There are some posts on issues based on OS and double or single quotes.

I would also check the PHP information

php -i

to see if PHP was compiled with CLI support disabled (--disable-cli).

查看更多
迷人小祖宗
5楼-- · 2019-01-21 09:38

The easiest way to do it is to use the -r flag. However, I've found that it does not allow multiline inputs. To work around that, you can do this:

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

Which lets you pipe from stdin, like so:

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

However, to answer the original question, if you do not have the -r flag available, it is also possible to use the -f flag - just pass stdin as the file to open: php -f /dev/stdin

If you do this, be aware that a) you need to include a blank space at the start of the input, and b) you have to open with <?php. Example:

echo -ne " <?php\necho 'test';" | php -f /dev/stdin
查看更多
何必那么认真
6楼-- · 2019-01-21 09:40

In new versions of PHP you just type "php -a" and you hop into an interactive mode, where you can experiment with PHP.

查看更多
登录 后发表回答