お手軽にPHPを実行するいくつかの方法

こんにちは、エンジニアの @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ファイルを実行することができると思いますので、その機能を利用してもよいでしょう。

f:id:akase244:20191014094304p:plain:w500

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を実行する方法はたくさんありますが、ちょっとした動作確認を行いたい場合にこのようなやり方を知っておくと開発の手助けになるかと思いますので、お気に入りの方法を見つけてみてはいかがでしょうか。