web-dev-qa-db-ja.com

コマンドラインでPHPコードの文字列を実行する

次のオプションがどのように機能するかと同様に、コマンドラインでPHPコードの行を実行できるようにしたいと思います。

:~> Perl -e "print 'hi';"
:~> python -c "print 'hi'"
:~> Ruby -e "puts 'hi'"

私ができるようにしたい:

:~> php "echo 'hi';"

Phpに必要なことを実行できる-rオプションがあることを読みましたが、使用しようとすると利用できないようです。 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オプションを使用しようとすると、次のメッセージが表示されます。

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

混乱させて申し訳ありません。

58

EDIT2:うん、それは PHP 5.2のCLI SAPI にあります。

編集:アップグレードできない場合、PHP 5.2(テストする手元にありません)にそのようなオプションがない場合は、これを行うことができます:

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

元の:

確かに-rオプションがあります(PHP 5.2)についてはわかりませんが):

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

PHPのコマンドラインバージョンを使用していることを確認してください。 php --versionは次のようなものを提供するはずです( "cli"に注意してください):

 D:\> php --version 
 PHP 5.3.0(cli)(built:May 20 2010 19:05:12)(DEBUG)
 Copyright(c)1997 -2009 PHP Group 
 Zend Engine v2.3.0、Copyright(c)1998-2009 Zend Technologies 
84
Artefacto

PHPの新しいバージョンでは、「php -a」と入力するだけで、PHPを試すことができるインタラクティブモードにジャンプします。

10
Damian W.

最も簡単な方法は、-rフラグを使用することです。ただし、複数行の入力は許可されていません。これを回避するには、次のようにします。

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

次のように、stdinからパイプできます。

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

ただし、元の質問に答えるために、-rフラグを使用できない場合は、-fフラグを使用することもできます。開くファイルとしてstdinを渡すだけです:php -f /dev/stdin

これを行う場合、a)入力の先頭に空白スペースを含める必要があり、b)<?phpで開く必要があることに注意してください。例:

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

最後に余分なセミコロンは必要ありません。

php -r "echo 'hi';" の代わりに php -r "echo 'hi';";

別の例(コマンドラインで現在のタイムスタンプを取得するには):

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

PHPコマンドライン機能 のこのページをご覧ください(まだお持ちでない場合)。 OSと二重引用符または単一引用符に基づく問題に関する投稿があります。

また、PHP情報も確認します

php -i

PHP=が CLIサポートを無効にしてコンパイルされている (--disable-cli)であるかどうかを確認します。

3
allnightgrocery