メニューボタン
IBMi海外記事2019.03.14

コマンドラインPHPを高速化する

Alan Seiden 著

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が大幅に高速に動作することについて説明しました。この手法を試して、スピードアップを実感してみてください。

あわせて読みたい記事

PAGE TOP