2022/05/25
WEBアプリをpharにして検証してみた(解説あり)
今回は、WEBアプリをpharにして、どんな感じか検証してみました。
PHPの基礎がある程度分かっている事を前提として記載していきますので、ご了承下さい!
Pharとは?
PHPの公式サイトに記載がありますが、一言で分かりやすく言うと
複数のPHPファイルを一つに纏めたものになります。(テキストファイルや画像といったものも含めれます)
これにより、ファイルが1つになるので配布が楽になったり、展開をせずにそのまま使用したりといった事が出来ます。
「composer.phar」といった形でよく見かける事があるかと思いますが、これがpharになります。
WEBアプリをphar作成〜アクセスまで実際に試した
今回はphpMyAdmin(WEBアプリ)をpharにして、WEBサーバーにアップロードしてアクセスしてみました。
この辺りもPHP公式サイトに記載がされています。気になる方はこちらからご確認ください。
まずは、phpMyAdmin(WEBアプリ)をpharにしてみましょう。
phpMyAdmin → pharにするのも、PHPにて行います。
pharの作成には、php.iniを変更する必要があるので、次の様に変更をしましょう。
phar.readonly = 0
phar.require_hash = 0
次にphpMyAdminをダウンロードします。
次のリンクの場所にアクセスをし、画像の赤枠の部分をダウンロードします。
https://www.phpmyadmin.net/downloads/
次にphpMyAdmin → pharにするPHPプログラムを作成します。
※コメントで解説を含めていますので、そちらもご確認ください。
create_phar.php
<?php
@unlink('phpMyAdmin.phar.tar.php');
copy('phpMyAdmin-5.2.0-all-languages.tar.gz', 'phpMyAdmin.phar.tar.php');
// 第一引数に既存のPharアーカイブ、あるいは作成したいアーカイブへのパスを指定します。
// 今回だと、既存のPharアーカイブという扱いになります。
$a = new Phar('phpMyAdmin.phar.tar.php');
// Pharへの書き込みをできるようにします。
$a->startBuffering();
// phar内にある「phpMyAdmin-5.2.0-all-languages/config.inc.php」の中身を次のように書き換えます。
$a["phpMyAdmin-5.2.0-all-languages/config.inc.php"] = '<?php
$cfg[\'blowfish_secret\'] = \'testtest\';
/* サーバーの設定 */
$i = 0;
/* Server localhost (config:root) [1] */
$i++;
$cfg[\'Servers\'][$i][\'compress\'] = false;
$cfg[\'Servers\'][$i][\'auth_type\'] = \'cookie\';
$cfg[\'Servers\'][$i][\'extension\'] = \'mysql\';
$cfg[\'Servers\'][$i][\'host\'] = \'localhost\';
$cfg[\'Servers\'][$i][\'port\'] = \'3306\';
$cfg[\'Servers\'][$i][\'user\'] = \'root\';
$cfg[\'Servers\'][$i][\'password\'] = \'root\';
$cfg[\'UploadDir\'] = \'\';
$cfg[\'SaveDir\'] = \'\';
/* サーバーの設定はここまで */
';
// requireなどでpharを呼び出した際に実行される処理をセットします。
$a->setStub('<?php
// file_get_contentsなどの関数をphar内で相対パスを指定してコールされると、phar内のファイルへのアクセスに変更されます。
Phar::interceptFileFuncs();
// 第一引数は、phar:// URLでこのアーカイブを指す際に、フルパスの代わりに使用するエイリアスを指定します。
// 第二引数は、pharの中でディレクトリインデックスとなるファイルの場所を指定します。
Phar::webPhar("phpMyAdmin.phar", "phpMyAdmin-5.2.0-all-languages/index.php");
echo "phpMyAdmin is intended to be executed from a web browser\n";
exit -1;
// 魔法の関数(setStubの最後に必ず入れる)
__HALT_COMPILER();
');
// Pharへの書き込みを終了し、変更内容をディスクに書き込みます。
$a->stopBuffering();
?>
ここまで出来たら、作成したPHPプログラム(create_phar.php)を実行するだけです。
php create_phar.php
実行すると、phpMyAdmin.phar.tar.phpというファイルが作成されたはずです。
これをWEBサーバーにアップロードしアクセスをすれば、phpMyAdminの画面が表示されるはずです!
非常に簡単ですね。
URLは次の様なイメージです。
https://localhost/phpMyAdmin.phar.tar.php/phpMyAdmin-5.2.0-all-languages/index.php
実際のアクセス
問題なく表示できていますね。
問題なく表示できましたが…….開くのがめちゃくちゃ遅い!
ネットワークを見てもらうとわかるのですが、全ての読み込みに50秒以上掛かっています。
ちなみに、普通に展開したphpMyAdminにアクセスした場合は次の様な感じです。
(pharをアップロードしたWEBサーバーと同じです)
1秒ちょっとで全ての読み込みが完了していますね。
ここまで、実際に試してみた感想としては、「WEBアプリをpharにすると使い物にならない」といった感じでした。
理想はパッケージ商品として、これをWEBサーバーに配置するだけで使用できるといったのが理想だったのですが、現状ではスピード面で難しい様です。
小規模のWEBアプリをpharにするのであれば問題ないのかもしれませんが、画像などのファイルも含まれると遅くなってしまうのかもしれません。
以上になります。
もう少し詳しく記載したかったのですが、長くなってしまいそうだったので、この辺にしておきます。
時間がある時に、もう少し詳しく説明したものを投稿しようと思います。