1

Web ページから C++ で記述された外部ライブラリを呼び出し、結果を表示する必要があります。プラットフォームは Linux、Apache、PHP です。

私の現在の考えは、ライブラリ/プログラムを呼び出す PHP サービスを使用することです。これを行うには 2 つの方法があることがわかりました。1) PHP の「exec」関数を使用する 2) PHP 拡張機能を作成する

何がより効果的に機能するのか興味がありますか?もっと早く?サーバーの負荷を軽減しますか?

おそらく毎秒 4 回の呼び出しが必要になるので、できる限り最適化したいと考えています。

PS Web ページから C++ ライブラリまたはプログラムを呼び出す他の (より効果的な) 方法を知っている場合は、お知らせください。

どうもありがとう、
ロブスタ

4

5 に答える 5

8

拡張機能は、新しいプロセスを作成するオーバーヘッドを回避するため、理論的に高速です。また、これは「よりクリーンな」ソリューションでもあります (面倒なプログラム引数のエスケープはありません。文字列などだけでなく、オブジェクトなどの任意の PHP 値を解析できます)。

ただし、そのライブラリを使用するコマンド ライン プログラムが既にある場合は、拡張機能を記述する代わりに、それを実行するだけの方が簡単です。

1 秒間に 4 回しか呼び出しを行わない場合、パフォーマンスの観点から、どのメソッドを使用するかは重要ではありません。ただし、ライブラリでコストのかかる初期化が必要な場合を除きます。これは、永続的な (クロス リクエスト) 状態を PHP 拡張機能に格納することで回避できます。

于 2010-06-13T12:30:11.600 に答える
4

Exec は、コンパイル済みの PHP 拡張機能を呼び出すよりも明らかに遅くなります。Ext_skel はあなたの親友です。

編集: 組み込みの拡張機能よりも exec が遅いという理論的なものはありません。strace を実行して、PHP スクリプト内の exec とコンパイルされた拡張機能への呼び出しの syscall の数を確認してください。

いくつかのベンチマークを次に示します。

システム: VMWARE ワークステーション、C2DUO E8400、2GB RAM

**4 回実行:

時間 ./a.php (EXEC)

実 0m0.944s
ユーザー 0m0.700s
システム 0m0.244s

時間 ./b.php (PHP 拡張)

実 0m0.268s
ユーザー 0m0.212s
システム 0m0.056s

**1000回実行:

時間 ./a.php (EXEC)

実際の 3m47.042s
ユーザー 2m48.239s
sys 0m56.784s

時間 ./b.php (PHP 拡張)

実際の 3m36.631s
ユーザー 2m46.922s
sys 0m49.627s

これは説明不要かと思います。コンパイルされた拡張機能はより高速に実行され、より環境にやさしく、消費する CPU 時間も少なくなります。より良いと考えられます。また、拡張機能を使用すると、リソースを再利用できます。同じ画像から 10 個の異なるバージョンを作成したい場合はどうすればよいでしょうか? new imagick('filename');その後、毎回オブジェクトを再作成する必要はありません。

time ./bx.php (リソースを再利用する PHP 拡張機能)

実際の 0m3.712s
ユーザー 0m3.552s
システム 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

于 2010-06-13T12:28:48.090 に答える
1

PHP 拡張機能を書く手間を省きたい (exec は遅すぎる) 場合は、使用しているライブラリのある種の Web サービスを作成し (XML-RPC や SOAP/REST などで)、これをphp コード。

これにより、デバッグが容易になり (作成したリクエストをログに記録して再生するだけ)、分離も容易になります (さまざまな理由で別のホストで一部を実行する必要がありますか? :P)

于 2010-06-13T12:48:26.390 に答える
0

速度と携帯性。PHP に対して別のライブラリをリンクする場合は、最新の状態に保つ必要があります。したがって、ビルド システムまたはディストリビューション用のカスタム パッケージが必要です。これは実際には大したことではありません。ただし、利用可能な場合は、コマンドライン ユーティリティを使用する方が簡単です。

したがって、セッションのような方法 (複数の呼び出し、環境の適応) で使用できるライブラリである場合は、必ずラッパーを作成する必要があります。毎秒 10 回以上呼び出さない場合、速度の違いは無視できます。次に、execve() メソッドに進みます。これは Unix の方法であり、アプリケーションに特定の寿命が期待される場合、実際にはより堅牢です。

于 2010-06-13T15:01:11.307 に答える
0

私が懸念しているのは、WebServiceがexeプログラムよりもはるかに遅いことです。しかし、 ZeisSが言ったように、プラットフォームに依存しないという利点があります。

そして、私はEmil Vikstromに強く同意します。例を考えてみましょう。あなたの家(システム)では、あなた(OS)はゲスト(Webサービス)よりも家族(exe)を優先します。再帰関数の場合、exe は Web サービスよりもはるかに高速に実行されます。

于 2010-06-13T13:43:58.620 に答える