PHPから外部ライブラリを呼び出します。 EXECまたは拡張子:速いとは何ですか?
-
27-09-2019 - |
質問
私はC ++で書かれた外部ライブラリへのWebページから電話をかけると、結果を表示する必要があります。プラットフォームは、Linux、Apacheのは、あるPHPます。
私の現在の考えは、私のライブラリ/プログラムを呼び出しますPHPのサービスを使用することです。私はこれを行うには2つの方法があることがわかりました。 1)PHPのexecを '関数を使用します 2)書き込みPHP拡張
私は、より効果的などのような作品好奇心?もっと早く?少ないサーバーをロードする?
私はおそらく、私は可能な限り最適なようにしたいので、毎秒4つの呼び出しを行う必要があります。
P.S。あなたがWebページからC ++ライブラリやプログラムを呼び出すいくつかの他の(より効果的)な方法を認識している場合、私に知らせてくださいます。
どうもありがとう、
ロブスタ
解決
拡張子は、理論的に高速です。また、(。何も厄介なプログラムの引数は、エスケープません。あなたは、このようなだけではなく、文字列のオブジェクトとして任意のPHP値を解析することができます、など)「クリーン」なソリューションです。
しかし、、すでに使用しているライブラリあなただけの拡張子を書くのではなく、それを実行するために、それが容易になります。
というコマンドラインプログラムを持っている場合 あなたのライブラリーは、PHP拡張モジュールに格納されている永続的(クロスリクエスト)状態を有することにより回避することができ、高価な初期化を必要としない限り、あなただけ、あなたが使用する方法二、性能面、それの無関心あたり4つの呼び出しを行う場合は、その注。
他のヒント
幹部はdefinetly遅くコンパイルPHP拡張モジュールを呼び出すよりも。 Ext_skelはあなたの親友である。
編集: 幹部に関する理論的なものは何も拡張子に建てられたよりも遅くはありませんがあります。どのようなコンパイル延長にPHPスクリプト内の幹部と電話をどのように多くのシステムコールをstraceのを実行するとチェックについて行います。
ここではいくつかのベンチマークはあります:
システム:VMware Workstationの、C2DUO E8400、2ギガバイトのRAM
** 4回実行ます:
時間./a.php(EXEC)
本当の0m0.944s
ユーザー0m0.700s
SYS 0m0.244s
時間./b.php(PHP EXTENSION)
本当の0m0.268s
ユーザー0m0.212s
SYS 0m0.056s
**千回実行ます:
時間./a.php(EXEC)
本当の3m47.042s
ユーザー2m48.239s
SYS 0m56.784s
時間./b.php(PHP EXTENSION)
本当の3m36.631s
ユーザー2m46.922s
SYS 0m49.627s
私は、これは任意の説明が必要とは思いません。コンパイルされた拡張機能は、より速く、より環境にやさしい、食べるより少ないCPU時間を実行します。良く考えました。また、拡張子を持つあなたは、リソースを再利用することができます。あなたは同じイメージから10の異なるバージョンを作成したい場合は?そして、あなたがオブジェクトnew imagick('filename');
を毎回再作成する必要はありません。
時間./bx.php(PHP EXTENSION再利用リソース)
本当の0m3.712s
ユーザー0m3.552s
SYS 0m0.156s
スクリプトAの内容:
#!/usr/bin/php5
<?php
for ($i=0; $i < 1000; $i++)
{
exec('/usr/bin/convert -thumbnail 150 src1.jpg dst.jpg');
}
?>
スクリプトBの内容:
#!/usr/bin/php5
<?php
for ($i=0; $i < 1000; $i++)
{
$img = new imagick('src1.jpg');
$img->thumbnailImage( 150, null );
$img->writeImage('dst.jpg');
} //for
?>
スクリプトBXの内容:
#!/usr/bin/php5
<?php
$img = new imagick('src1.jpg');
for ($i=0; $i < 1000; $i++)
{
$img->thumbnailImage( 150, null );
$img->writeImage('dst.jpg');
} //for
?>
スクリプトフォークとSTACKTRACE(簡単な実行): LINK の
スクリプトフォーク付きのB STACKTRACE(簡単な実行): LINK の
あなた自身(Execが遅すぎる)あなたが使用しているライブラリのWebサービスのいくつかの種類を書きたいかもしれないPHP拡張モジュールを足すの手間を惜しましたい場合(例えばXML-RPCまたはSOAP / REST付き)と呼び出しこれはあなたのPHPコードから。
これはだけでなく、(単にあなたが行われた要求をログに記録し、それらを再生)デバッグが容易であるべき分離しやすい(様々な理由のために別のホスト上の一部を実行する必要があります?P)
ははるかに遅いexeファイルのプログラムよりもです。 のツァイスのが言ったように。
しかし、プラットフォームに依存しないことの利点を持っています のそして、私は強くのに同意エミールVikstrom。あなたの家では、例を考えてみましょう(システム)を使用する(OS)は、ゲスト(Webサービス)よりも家族(EXE)のためのより優先します。再帰関数の場合は、exeファイルは、はるかに高速にWebサービスよりも実行されます。
スピード対ポータビリティ。あなたがPHPに対して別のライブラリをリンクする場合は、それが更新さを維持する必要があります。したがって、ビルドシステムまたはいっそのディストリビューション用のカスタムパッケージが必要です。これは事実上大したことではありません。しかし、それは可能な場合だけでコマンドラインユーティリティを使用することが簡単です。
だから、それは(複数の呼び出し、環境に適応)セッションのような形式で使用することができるライブラリである場合、あなたは間違いなくラッパーを構築する必要があります。あなたは>毎秒10回、それを起動していない場合は、速度差はごくわずかです。その後はexecve()メソッドに移動します。アプリケーションが特定の生涯の期待を持っている場合はUnixの道であり、事実上、より堅牢なのです。