コマンドラインPHPを高速化する
PHPはApache Webサーバーを介して高速に動作しますが、コマンドラインPHPスクリプト(直接PASEから、あるいはCLまたはRPGを介して実行)はスタートアップ時に遅れが生じます。
この記事では、コマンド ライン(PHP-CLIとして知られる)から呼び出されたときにPHPを高速化する方法について説明します。
なぜ、PHP-CLI(コマンド ラインPHP)は、スタートアップが遅くなるのでしょうか。
いくつか理由が挙げられることもありますが、私の考えでは、犯人は、Zend Serverのphp.iniやその他の構成ファイルによって有効化されるPHPエクステンションのロードだと思います。
エクステンションの例としては、ibm_db2、simplexml、およびZendのプロプライエタリーなコンポーネントがあります。
通常のWebサーバー環境内では、エクステンションのロードにより、PHPが遅くなることはありません。
これは、PHPをプリロードするときにFastCGIがすべての構成済みのエクステンションをプリロードするからです。
これに対して、コマンド ラインから(あるいはCLまたはRPGから)PHPを実行するときには、PHPはプリロードできず、実行時にロードされます。
その場合、エクステンションをロードするのに数秒間、時間を要する場合があります。
-no-php-iniおよび-defineオプションを使用することにより、PHP-CLIを高速化することができます。
以下は、http://php.net/manual/en/features.commandline.options.phpのクイック リファレンスからの引用です。
-no-php-ini |
php.iniを完全に無視します。 |
-define | php.iniで許可される任意の構成ディレクティブにカスタム値を設定します。 |
以下に示す例はすべて、/usr/local/zendphp7にインストールされているPHP 7を前提にしていることに注意してください。
ただし、有効な最近のPHPバージョンまたはロケーションに置き換えることも可能です。
以下の簡単なスクリプトについて検討してみましょう。
<?php
// simple.php code
echo "PHP script running.\n";
?>
Simple.phpは、スクリプトが実行されていることを示すメッセージを出力します。
ここではスクリプトを実行するオーバーヘッド(スクリプト自体によって必要とされる時間ではなく)を測定することが目的なので、シンプルなスクリプトが最適です。
simple.phpをIFS上のいずれかの場所へ保存します。
ユーザー プロファイルに*Rアクセス権があり、それより上のすべてのディレクトリーに少なくとも*Xアクセス権があることを確認してください。
ここでは、/www/zendphp7/htdocsに保存することとします(他の場所でも構いません)。
simple.phpを実行する
まず、PASEターミナルに移動します(SSHシェルおよびBashのほうがよりよく機能すると思われますが、Bashがインストールされていないことも考えられますので、ここでは従来のQP2TERMを使用して説明します)。
CALL PGM(QP2term)
ここで、PHP 7バイナリーのディレクトリーに移動します。
cd /usr/local/zendphp7/bin
デフォルトのphp.iniを使用してスピード テストを実行します。
php /www/zendphp7/htdocs/simple.php
ストップウォッチで測ってみれば、スクリプトが実質的に何も処理を行わなくても、テストの実行には最長で2、3秒かかることが分かると思います。
ここで、-no-php-iniオプションを追加します。
これにより、PHPはどの.iniファイルも読み込まなくなり、そのため、どのエクステンションもロードしません。
php --no-php-ini /www/zendphp7/htdocs/simple.php
-no-php-iniオプションを使用すると、スクリプトがほぼ瞬時に戻ってくるようになることに気付くと思います。
選択肢は「オールオアナッシング」でありません。
コマンド ラインで構成値を追加することができます。
もう一度、テスト スクリプトを実行します。
今度は、-defineを追加して、広く使用されているIBM i 向けのエクステンションである、ibm_db2エクステンションをロードします。
php --no-php-ini --define extension=/usr/local/zendphp7/lib/php_extensions/ibm_db2.so /www/zendphp7/htdocs/simple.php
スクリプトは、1つのエクステンションをロードしますが、それでも高速に実行されました。
スタートアップを高速化
PHPの-no-php-iniおよび-defineオプションを使用して、エクステンションを減らすと、PHP-CLIが大幅に高速に動作することについて説明しました。この手法を試して、スピードアップを実感してみてください。