こんにちは、エンジニアの @akase244 です。
普段の業務ではPHPを使ってwebアプリケーションを開発しているので、php-fpmやApache(mod_php)の環境下でPHPを実行しています。
しかし、コードを書いてるときに頭の中で考えたロジックを手元でササッと確認してからコードに反映したいという場面もよくあるかと思います。
そんなときに私がよくやっている方法とその他にもPHPを実行するいろいろなやり方を調べたので紹介します。
対話シェルで実行する
コマンドラインからPHPを実行する方法はいくつかありますが、対話シェルを好んで使っています。 対話シェルは「php -a」もしくは「php --interactive」で起動します。
$ php -a Interactive shell php > echo 'Hello, PHP' . PHP_EOL; Hello, PHP
「quit」、「exit」、「Control + d」のいずれかで終了します。
php > exit $
マニュアルでは「PHP 5.1.0 以降では、--with-readline オプションつきで PHP をコンパイルした場合に CLI SAPI で対話シェルが使えるようになりました。」との記載がありますが、PHP5.2.3以降とPHP5.2.2以前で動作が異なるようです。
PHP5.2.3以降は「php -a」実行時に「Interactive shell」と表示され、直後に対話型のインターフェースを提供してくれますが、PHP5.2.2以前は以下のようにPHPの開始タグを入力しないと実行できないところが注意点です。
$ php-5.2.2/bin/php -a Interactive mode enabled <?php echo 'Hello, PHP' . PHP_EOL; X-Powered-By: PHP/5.2.2 Content-type: text/html Hello, PHP
よく見ると実行直後のメッセージが「Interactive mode enabled」となっており、この動作はPHP5.2.2以前のPHP5系だけでなくPHP4系も同様のようです。 今回、CentOS6.10の環境で調査を行いましたが、PHP4系でこの動作が確認できた最も古いバージョンは4.0.5でした。
$ php-4.0.5/bin/php -a Interactive mode enabled <?php echo "Hello, PHP\n"; X-Powered-By: PHP/4.0.5 Content-type: text/html Hello, PHP
4.0.4以前はgccのエラーが発生してコンパイルがうまくいかず動作確認ができませんでしたが、4.0.0のソースファイル(sapi/cgi/cgi_main.c)に「printf("Interactive mode enabled\n\n");」という記述があるため、この機能は4系の最初から実装されていたようですね。
コマンドライン上で実行する
「php -a」は対話型でしたが、「php -r」もしくは「php --run」を利用するとコマンドライン上でそのままPHPのコードが実行できます。
$ php -r "echo 'Hello, PHP' . PHP_EOL;" Hello, PHP
PHPファイルを実行する
もちろんPHPを記述したファイルをphpコマンドに渡すことで実行することも可能です。ファイルを実行する場合、「-f」オプションは省略可能です。
$ cat hello.php <?php echo 'Hello, PHP' . PHP_EOL; $ php -f hello.php Hello, PHP $ php hello.php Hello, PHP
エディタの機能でPHPファイルを実行する
私は普段PhpStormを利用していますが、PhpStormに限らず各エディタの機能で編集中のPHPファイルを実行することができると思いますので、その機能を利用してもよいでしょう。
Vagrantで実行する
次はローカルにPHPの実行環境がない場合にVagrantを利用する方法です。
Laravel Homestead
Laravel公式のHomesteadというVagrant boxがあるので、これを利用してみます。 インストール手順の解説については公式のドキュメントを参照してください。 2019年10月15日時点の最新のリリース版ではPHP7.3.9の環境で動作するようです。
ホストPCにて
$ vagrant box add laravel/homestead $ git clone https://github.com/laravel/homestead.git $ cd homestead/ $ git checkout release $ bash init.sh Homestead initialized! $ vagrant up $ vagrant ssh
ゲストPCにて
$ php -v PHP 7.3.9-1+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Sep 2 2019 12:54:24) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.3.9, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.3.9-1+ubuntu18.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies $ php -r "echo 'Hello, PHP' . PHP_EOL;" Hello, PHP
rasmusさん謹製
PHPの生みの親であるrasmusさんの手によるVagrant boxが存在するので触ってみました。
しかし、このboxは「php7dev」という名前の通りPHP7系が出始めた頃のテスト用として利用されていたもののようで、PHPのバージョンも少々古いため使わないほうがよいかと思います。
ホストPCにて
$ vagrant box add rasmus/php7dev $ mkdir php7dev $ cd $_ $ vagrant init rasmus/php7dev $ vagrant up $ vagrant ssh
ゲストPCにて
$ php -v PHP 7.1.0-dev (cli) (built: Sep 6 2016 04:38:13) ( NTS ) Copyright (c) 1997-2016 The PHP Group Zend Engine v3.1.0-dev, Copyright (c) 1998-2016 Zend Technologies with Zend OPcache v7.1.0-dev, Copyright (c) 1999-2016, by Zend Technologies with Xdebug v2.5.0-dev, Copyright (c) 2002-2016, by Derick Rethans $ php -r "echo 'Hello, PHP' . PHP_EOL;" Hello, PHP
Dockerで実行する
Vagrantはセットアップに手間がかかるので、ササッと動かしたい場合はDockerの方がお手軽かと思います。
最新版を利用する場合
2019年9月26日にPHP7.3.10がリリースされていますが 2019年10月15日時点のDocker HubのlatestではPHP7.3.9となっているようです。
$ docker container run --rm -it php:latest php -v PHP 7.3.9 (cli) (built: Sep 3 2019 05:30:13) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.3.9, Copyright (c) 1998-2018 Zend Technologies $ docker container run --rm -it php:latest php -r "echo 'Hello, PHP' . PHP_EOL;" Hello, PHP
バージョンを指定する場合
https://registry.hub.docker.com/v1/repositories/php/tags にアクセスすると、このようなJSON形式で利用可能なバージョンの情報が取得できます。
[{"layer": "", "name": "latest"}, {"layer": "", "name": "5"}, {"layer": "", "name": "5-alpine"}, {"layer": "", "name": "5-alpine3.4"}, {"layer": "", "name": "5-alpine3.7"}, {"layer": "", "name": "5-alpine3.8"}, {"layer": "", "name": "5-apache"}, {"layer": "", "name": "5-apache-jessie"}, {"layer": "", "name": "5-apache-stretch"}, {"layer": "", "name": "5-cli"}, {"layer": "", "name": "5-cli-alpine"}, {"layer": "", "name": "5-cli-alpine3.4"}, {"layer": "", "name": "5-cli-alpine3.7"}, {"layer": "", "name": "5-cli-alpine3.8"}, {"layer": "", "name": "5-cli-jessie"}, {"layer": "", "name": "5-cli-stretch"},・・・
このままの形式だと見づらいので今回はjson_ppコマンドを利用して整形してみます。 json_ppコマンドはMacに標準で付属しているJSON形式をフォーマットするツールです。(類似ツールのjqを利用しても同じ結果が得られます)
$ curl -s https://registry.hub.docker.com/v1/repositories/php/tags |json_pp |grep name |grep cli-alpine "name" : "5-cli-alpine", "name" : "5-cli-alpine3.4" "name" : "5-cli-alpine3.7" "name" : "5-cli-alpine3.8", ・ ・ ・ "name" : "7.3.9-cli-alpine" "name" : "7.3.9-cli-alpine3.10" "name" : "7.3.9-cli-alpine3.9", "name" : "7.4-rc-cli-alpine", "name" : "7.4-rc-cli-alpine3.10" "name" : "7.4-rc-cli-alpine3.9", "name" : "7.4.0RC1-cli-alpine" "name" : "7.4.0RC1-cli-alpine3.10", "name" : "7.4.0RC3-cli-alpine", "name" : "7.4.0RC3-cli-alpine3.10" ・ ・ ・
この中から利用したいバージョンを指定します。
$ docker container run --rm -it php:7.3.10-cli-alpine php -r 'echo "Hello, PHP".PHP_EOL;' Hello, PHP
おまけ
PsySH(REPL)で実行する
Laravel付属のTinkerを好んで利用されている方もいらっしゃるかと思いますが、Tinkerを実行すると「Psy Shell」というメッセージが表示されています。
つまり、TinkerはPsySHというREPL(Read-Eval-Print Loop)を内包していて、このPsySH単体でも利用が可能です。
※Mac上でインストールすると実行時に落ちる場合があるのでここを参考にするとよいでしょう。
Tinkerを実行した様子
$ php artisan tinker Psy Shell v0.9.9 (PHP 7.2.23 — cli) by Justin Hileman
PsySHのインストールと実行
$ mkdir psysh $ cd $_ $ curl -LO https://psysh.org/psysh $ chmod +x psysh $ ./psysh Psy Shell v0.9.9 (PHP 7.2.23 — cli) by Justin Hileman >>> $companyName = ['INNOVATOR', 'JAPAN', 'INC.'] => [ "INNOVATOR", "JAPAN", "INC.", ] >>> echo implode(' ', $companyName); INNOVATOR JAPAN INC.⏎ >>> echo 'Hello, PHP' . PHP_EOL Hello, PHP
ブラウザ上で実行する
ブラウザ上で実行できる環境を提供しているwebサービスはたくさんありますが、PHPのバージョン毎の実行差異を確認したい場合は、3v4lもしくはPHP Sandboxを使ってみてはいかがでしょう。
まとめ
PHPを実行する方法はたくさんありますが、ちょっとした動作確認を行いたい場合にこのようなやり方を知っておくと開発の手助けになるかと思いますので、お気に入りの方法を見つけてみてはいかがでしょうか。