PHPでは、 FsoCopen()は比較的低レベルのネットワーク通信機能です。ネットワーク接続を開くために使用され、HTTP、HTTP、SMTP、FTPなどのプロトコルの通信を実現できます。最新のPHPプロジェクトでは、CurlやGuzzleなどのライブラリを使用してWeb API、 FSOCCKOPEN()を使用して、特定のシナリオではまだかけがえのない役割があります。この記事では、Web APIを呼び出すアプリケーションシナリオを調べ、その使用を最適化して効率を向上させる方法を分析します。
fsockkopen()を使用して、HTTP要求のすべてのバイトを完全に制御します。 file_get_contents()およびcurlと比較して、 fsocopen()を使用すると、開発者はリクエストヘッダーとリクエストボディを手動で構築できます。これは、次のようなパケット構造を正確に制御するシナリオに適しています。
$fp = fsockopen("gitbox.net", 80, $errno, $errstr, 5);
if ($fp) {
$out = "GET /api/notify HTTP/1.1\r\n";
$out .= "Host: gitbox.net\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
適しています:基礎となるHTTP通信のデバッグ、標準以外のサービスでのドッキング、または特別な認証メカニズムを必要とするAPI。
FSOCCKOPEN()は、非ブロッキングモードでリクエストの送信をサポートし、相手が応答するのを待たずにAPIコールを背景に非同期にトリガーできるようにします。データを返す必要のないログアップロード、通知プッシュなどのビジネスロジックに非常に適しています。例えば:
$fp = fsockopen('gitbox.net', 80, $errno, $errstr, 1);
if ($fp) {
stream_set_blocking($fp, 0);
$out = "POST /api/trigger HTTP/1.1\r\n";
$out .= "Host: gitbox.net\r\n";
$out .= "Content-Type: application/json\r\n";
$data = json_encode(['event' => 'new_user']);
$out .= "Content-Length: " . strlen($data) . "\r\n";
$out .= "Connection: Close\r\n\r\n";
$out .= $data;
fwrite($fp, $out);
fclose($fp); // 今すぐ閉じてください,応答を待たないでください
}
適切な:バックグラウンドタスクのトリガー、データ統計の概要、非同期ロギングサービス。
Curl拡張機能は、共有仮想ホストなどの一部のPHP環境で無効になる場合があります。FSoCopen ()は、軽量の展開に適した基本的なHTTPリクエスト機能を備えた追加の拡張機能のない代替案です。
pfsocckopen() (永続的なfsocckopen)は、永続的な接続を確立できます。
$fp = pfsockopen("gitbox.net", 80, $errno, $errstr, 3);
適した:データのバッチレポートなど、複数のリクエストが短期間で集中しています。
接続タイムアウトを合理的に設定し、タイムアウトパラメーターを読み取り、相手が反応しない場合に長時間吊り下げないようにします。
$fp = fsockopen("gitbox.net", 80, $errno, $errstr, 2);
stream_set_timeout($fp, 2); // タイムアウトを読んでください
Stream_get_meta_data()を組み合わせて、タイムアウトが次のかどうかを検出します。
$status = stream_get_meta_data($fp);
if ($status['timed_out']) {
error_log("Timeout occurred");
}
Stream_Select()を組み合わせて、同時の非ブロッキング要求を実装して、複数のAPI要求の処理を並行してシミュレートし、全体的なスループットを改善し、バッチ並行リクエストの最適化に適しています。
リクエストヘッダーとリクエストボディ構造の最適化、データコンテンツの圧縮、コンテンツレングスの合理的な構成は、帯域幅の使用と応答時間を効果的に短縮できます。
高い並行性アプリケーションでは、ソケット接続プールを単独で維持し、接続リソースを再利用することができ、接続リソースを削減できますが、通常、これは常駐メモリプログラム(Swoole/FPM Keep-Aliveプロセスなど)で行う必要があります。
FSOCCKOPEN()は、現代のPHP開発の主要なHTTPクライアントとしてはあまり使用されていませんが、特定のニーズの下ではまだ価値があります。 file_get_contents()よりも細かい制御機能を提供し、リソースに制約のある環境では、カールに代わる優れた代替手段でもあります。非同期コール、非ブロッキングフロー、タイムアウト制御、永続的な接続メカニズムを合理的に使用することにより、Web APIを呼び出すときにより高い効率を実現できます。パフォーマンスと制御の精度を必要とするアプリケーションシナリオの場合、 FSOCOPEN()は詳細な研究に値するツールです。
関連タグ:
API