1

問題は、SSLで保護されたサーバーにすばやく接続し、そこからデータを送受信できるアプリケーション(おそらく、PHP?)を開発したいということです。私の目的は、クエリを送信して結果をできるだけ早く読み取るようにすることです。私はさまざまなソリューションを試し、それらすべてのベンチマークを行っています。fsockopen()とCURLを試しましたが、どうすればそれらを改善できるか疑問に思っています。

結果は次のとおりです。fsockopen():

  • 送信されたヘッダー:0.26755499839783;
  • 受信したページ:0.48934602737427;

CURLの結果:

  • [total_time] => 0.484
  • [pretransfer_time] => 0.281
  • [starttransfer_time] => 0.437

質問は次のとおりです。1)接続先のサーバーでクエリの実行が開始されたとき-ヘッダーが送信された後、またはページを取得して接続が閉じられた後?2)fsockopen()の結果を比較する必要があるCURLの予想時間はどれですか?ヘッダーがサーバーに送信される前でも、starttransfer_timeはありますか?これは、fsockopen()の方が速いということですね。3)コードが実行されるサーバーでSSL接続を微調整する方法はありますか?PHPのOpenSSLモジュール(暗号のダウングレードの可能性はありますか?)を高速化するために可能な調整はありますか?4)SSLなしでSSLで保護されたサーバーに移行するためのソリューションはありますか?5)この場合、C ++または他のソリューションの方が速いでしょうか?

どんなアイデアでも大歓迎です:)私はこの「ms」レースに夢中になりました:)

ありがとう、ジョナス

4

3 に答える 3

1

あなたの質問に対する厳密な解決策はありません。

C++ については、PHP が解釈され、C++ がコンパイル + 最適化されているのは事実ですが、PHP の暗号ライブラリはすべてプレーン C であるため、コンパイル + 最適化されています。

サーバーのハードウェアに応じて、サーバー キーを短くすると、ハンドシェイク フェーズが少し速くなります。また、最も重要なこととして、TCP に依存するすべてのネットワーク プロトコルは、トランザクションを処理するときにネットワーク遅延の影響を受けます。これは、トランザクションが同期されているため、データ転送 (FTP など) とは動作が異なります。

ともかく...

1.手動で接続を閉じる必要があります

4. 完全な SSL プロトコルを自分で書きたくない場合は、利用可能な最もパフォーマンスの高いライブラリである openSSL を使用することをお勧めします。

5.はい、いいえ、少なくともパフォーマンスは向上するかもしれませんが、それほど重要ではないかもしれません。一般的に、私はそれをお勧めします

于 2010-10-31T20:04:23.903 に答える
0

一般的なアプローチについてのコメントと、質問 2 への回答:

ベンチマークを作成する (つまり、2 つ以上の異なるテクノロジ オプションの相対的なパフォーマンスを比較する) 場合、テクノロジ自体によって報告されるタイミング情報に依存するべきではありません。主な理由は、報告されている内容を正確に知ることは (サード パーティのコードを掘り下げない限り) 困難であり、もちろん、同じことを保証できない 2 つの値を正確に比較する方法がないためです。計測。

代わりに、次のことを行う必要があります。

  • 機能的に同一の 2 つのコードを記述します。つまり、同じアルゴリズムを使用し、同じデータを操作するなど、まったく同じことを行います。唯一の違いは、一方が 1 つのテクノロジを使用することです ( fsockopen など)、もう一方は別のテクノロジ (CURL など) を使用します。

  • ここで、両方のコードを同じループでラップし、コードを何度も繰り返し呼び出します (例: 1000)。試行のバッチごとに、合計実行時間を 10 秒以上の範囲にする必要があります。

  • 最後に、各ループ (CURL を試行するループと fsockopen を試行する別のループ) を 2 つの同一のタイミング コードでラップします。ループを開始する前に時間を (ミリ秒またはマイクロ単位で) キャプチャし、ループのすべてのサイクルを実行してから、時間を再度キャプチャして減算します。

  • これにより、2 つのテクノロジーが実際にどれだけうまく機能するかについて、より代表的なイメージが得られます。必要に応じて、ループ内の反復回数で最終時間を割ることができますが、両方のテストが同じ回数の反復を実行する限り、そうする必要はありません。

補足: 既にご存知かもしれませんが、php でベンチマーク コードを記述する場合は、次のように、オプションのパラメーターを指定して microtime 関数を使用する必要があります。

<?php
  $start = microtime(true);
  /* run benchmark code */
  $elapsed = microtime(true) - $start;
  echo( "elapsed time: {$elapsed} microseconds");

microtime のオプション パラメータは php >5.0 でのみ使用できるため、まだ php 4.x を使用している場合は、2 つの時刻を文字列として保存し、後で解析してそれらを取得する必要があります。数字に変換して、それらを使って計算できるようにします。詳細については、microtime()の php ドキュメントを参照してください。

于 2010-10-31T20:39:35.460 に答える
0

fopen() https ラッパー (とstream_context_create() )を使用できますが、他の 2 つよりも高速かどうかはわかりません。

于 2010-10-31T20:40:06.107 に答える