php fsockopenソリューション

Jun 13, 2016 pm 01:15 PM
host socket sockets stream

php fsockopen ソリューション

最近 PHP マルチスレッドの問題を調査したところ、中国語のリソースが非常に少ないことがわかりました。いくつかの記事は何度も再投稿されていますが、記事の内容の価値は限られています。検索中に、多くの海外サイトで引用されている、よく書かれた記事を見つけたので翻訳してみました。

著作権表示: 転載は自由です。転載する場合は、必ず記事とこの記述の出典と著者情報をハイパーリンクの形式で明記してください。
http://blog. iyi.cn/start/

質問:
PHP でマルチスレッドを実装する方法はありますか?

複数のサーバーに基づいて PHP アプリケーションを作成しているとします。理想的な状況は、リクエストを次々に送信するのではなく、同時に複数のサーバーに送信することです。
それは可能ですか?
答え:

同時実行機能を実装したいとき、通常、フォークまたは生成スレッドを使用することを考えますが、PHP がマルチスレッドをサポートしていないことがわかると、考えを変え、perl などの十分ではない言語を使用する可能性があります。 。

実際、ほとんどの場合、フォークやスレッドを使用する必要はなく、フォークやスレッドを使用するよりもパフォーマンスが向上します。

n 台の実行中のサーバーが正常に機能していることを確認するサービスを構築するとします。次のようなコードを書くとよいでしょう:

?

<?php 
$hosts = array("host1.sample.com", "host2.sample.com", "host3.sample.com"); 
$timeout = 15; $status = array(); 
foreach ($hosts as $host) { 
??? $errno = 0; 
??? $errstr = ""; 
??? $s = fsockopen($host, 80, $errno, $errstr, $timeout); 
??? if ($s) { 
??????? $status[$host] = "Connectedn"; 
??????? fwrite($s, "HEAD / HTTP/1.0rnHost: $hostrnrn"); 
??????? do { 
??????????? $data = fread($s, 8192); 
??????????? if (strlen($data) == 0) { break; }
? ? ? ? ? ? $status[$host] .= $data; 
??????? } while (true); fclose($s); 
??? } else { 
??????? $status[$host] = "Connection failed: $errno $errstrn"; 
??? } 
} 
print_r($status); 
?>
ログイン後にコピー

これは問題なく動作しますが、このコードを拡張して多数のサーバーを管理するには、 fsockopen() がホスト名を解析して正常な接続を確立するまで (または $timeout 秒遅れて) 長い時間がかかります。
したがって、このコードを放棄する必要があります。非同期接続を確立できるため、fsockopen が接続ステータスを返すのを待つ必要はありません。 PHP は依然としてホスト名を解決する必要があります (したがって、IP を直接使用する方が賢明です) が、接続を開いた後すぐにホスト名が返されるため、次のサーバーに接続できます。
これを実現するには 2 つの方法があります。PHP5 では、新しい stream_socket_client() 関数を使用して fsocketopen() を直接置き換えることができます。 PHP5 より前のバージョンの場合、問題を解決するには自分で実行し、ソケット拡張機能を使用する必要があります。

PHP5 での解決策は次のとおりです:

<?php 
$hosts = array("host1.sample.com", "host2.sample.com", "host3.sample.com"); 
$timeout = 15; 
$status = array(); 
$sockets = array(); 
foreach ($hosts as $id => $host) { 
??? $s = stream_socket_client("$host:80", $errno, $errstr, $timeout,STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT); 
??? if ($s) { 
??????? $sockets[$id] = $s; 
??????? $status[$id] = "in progress"; 
??? } else { 
??????? $status[$id] = "failed, $errno $errstr"; 
??? } 
} 
while (count($sockets)) { 
??? $read = $write = $sockets; 
??? $n = stream_select($read, $write, $e = null, $timeout); 
??? if ($n > 0) { 
??????? foreach ($read as $r) { 
??????????? $id = array_search($r, $sockets); 
??????????? $data = fread($r, 8192); 
??????????? if (strlen($data) == 0) { 
??????????????? if ($status[$id] == "in progress") { 
??????????????????? $status[$id] = "failed to connect"; 
??????????????? }??????????? 
??????????????? fclose($r); 
??????????????? unset($sockets[$id]); 
??????????? } else { 
??????????????? $status[$id] .= $data; 
??????????? } 
??????? } 
??????? foreach ($write as $w) { 
??????????? $id = array_search($w, $sockets); 
??????????? fwrite($w, "HEAD / HTTP/1.0rnHost: " . $hosts[$id] . "rnrn"); 
??????????? $status[$id] = "waiting for response"; 
??????? } 
??? } else { 
??????? foreach ($sockets as $id => $s) { 
??????????? $status[$id] = "timed out " . $status[$id]; 
??????? } 
??????? break; 
??? } 
} 
foreach ($hosts as $id => $host) { 
??? echo "Host: $hostn"; echo "Status: " . $status[$id] . "nn"; 
} 
?>
ログイン後にコピー

stream_select() を使用して、ソケットが開く接続イベントを待ちます。 stream_select() は、システムの select(2) 関数を呼び出して機能します。最初の 3 つのパラメータは、使用するストリームの配列であり、(3 つのパラメータごとに) 読み取り、書き込み、例外の取得が可能です。 stream_select() は、$timeout (秒) パラメータを設定することでイベントが発生するのを待つことができます。イベントが発生すると、渡したパラメータに対応するソケット データが書き込まれます。

以下は PHP 4.1.0 以降の実装です。PHP のコンパイル時にソケット (ext/sockets) サポートを組み込んでいる場合は、上記と同様のコードを使用できますが、streams/ の関数を追加する必要があります。上記のファイルシステム関数は ext/sockets 関数を使用して実装されています。主な違いは、stream_socket_client() の代わりに次の関数を使用して接続を確立することです:

<?php 
// This value is correct for Linux, other systems have other values 
define('EINPROGRESS', 115); 
function non_blocking_connect($host, $port, &$errno, &$errstr, $timeout) { 
??? $ip = gethostbyname($host); 
??? $s = socket_create(AF_INET, SOCK_STREAM, 0); 
??? if (socket_set_nonblock($s)) { 
??????? $r = @socket_connect($s, $ip, $port); 
??????? if ($r || socket_last_error() == EINPROGRESS) { 
??????????? $errno = EINPROGRESS; return $s; 
??????? } 
??? } 
??? $errno = socket_last_error($s); 
??? $errstr = socket_strerror($errno); 
??? socket_close($s); 
??? return false; 
} 
?>
ログイン後にコピー

ここで、stream_select() をsocket_select()、fread() をsocket_read()、fwrite() をsocket_write()、fclose() をsocket_close()に置き換えて、スクリプトを実行します。
PHP5 の進歩は、stream_select() を使用してほぼすべてのストリームを処理できることです。たとえば、これを使用して、STDIN を含めてキーボード入力を受信し、配列に保存したり、 proc_open() データを通じてパイプが開かれました。
PHP4.3.xにストリーム処理機能を持たせたい場合は、fsockopenを非同期で動作させるパッチを用意しました。このパッチは非推奨であり、正式にリリースされた PHP バージョンには含まれません。このパッチには stream_socket_client() 関数の実装が含まれており、これを使用してスクリプトを PHP5 と互換性を持たせることができます。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Windows 11 シャットダウン プロンプト タスク ホスト ウィンドウ タスク ホストがシャットダウン タスク ソリューションを実行しています Windows 11 シャットダウン プロンプト タスク ホスト ウィンドウ タスク ホストがシャットダウン タスク ソリューションを実行しています Feb 12, 2024 pm 12:40 PM

最近、多くの Win11 ユーザーが、シャットダウン時に、taskhostwindow タスク ホストがシャットダウン タスクを実行しているというメッセージが表示されると報告しています。ユーザーは、ローカル レジストリ エディターの下のデスクトップ フォルダーに入り、右側のウィンドウで AutoEndTasks を選択して設定できます。このサイトは、シャットダウン時にこの問題の解決策をユーザーに丁寧に紹介します。 Windows 11 のシャットダウンでは、taskhostwindow タスク ホストがシャットダウン タスクを実行していることを示すメッセージが表示されます。 解決策 1. 次の図に示すように、win キー + r キーの組み合わせを使用し、「regedit」と入力して Enter キーを押します。 2. [HKEY]を検索します

Windows 11 で aggregator host.exe が安全かどうかを確認する方法 Windows 11 で aggregator host.exe が安全かどうかを確認する方法 Apr 13, 2023 pm 04:22 PM

タスクを終了したりアプリケーションを停止したりするためにタスク マネージャーを起動すると、通常、多数のプロセスが実行されていることがわかります。これはまったく正常なことです。ただし、まったく気づいていないシステム リソースを使用しているプログラムが存在することがあります。これらのプロセスの 1 つはアグリゲーター host.exe であり、最近ユーザーの間で混乱を引き起こしています。これらのプロセスの一部は正当な Windows 要件である可能性がありますが、その他のプロセスはバックグラウンドで実行され、ユーザーの認識や同意なしに問題を引き起こす悪意のあるプログラムである可能性があります。 Windows 11 でタスク マネージャーを起動する 5 つの方法を説明した後、aggregator host.exe が安全かウイルスかを確認する方法を説明します。ついていく

マスターとホストの違いは何ですか マスターとホストの違いは何ですか Sep 28, 2023 pm 01:34 PM

マスターとホストの違いは次のとおりです: 1. ホストはクライアントまたはサーバーの役割を果たすことができますが、マスターは分散システム内の他のスレーブ サーバーの調整と管理を担当する中央サーバーです; 2. ホストは通常​​のコンピュータ デバイスであり、マスターです通常、より高い処理能力を持ち、タスクの処理と分散、データの管理、システム全体の安定性の維持にリソースが使用されます; 3. ホストはネットワーク内のノードであり、マスターはネットワーク内で中心的な役割を果たすサーバーです。分散システム。

ホストへのルートがない場合の対処方法 ホストへのルートがない場合の対処方法 Oct 07, 2023 am 10:50 AM

「ホストへのルートがありません」の解決策には、ネットワーク接続の確認、IP アドレスとポートの確認、ファイアウォール構成の確認、ルーティング構成の確認、ネットワーク デバイス構成の確認、ネットワーク サービス ステータスの確認、ネットワーク構成の確認と連絡先が含まれます。ネットワーク管理者。詳細な紹介: 1. ネットワーク接続をチェックして、クライアントとターゲット ホスト間のネットワーク接続が正常であることを確認します。ping コマンドまたはその他のネットワーク ツールを使用してネットワーク接続をテストし、ネットワーク ケーブルなどのハードウェア デバイスが接続されているかどうかを確認します。 、ワイヤレス ネットワーク、ルーターが正常に動作していることを確認してください。ネットワーク接続が安定していることなどを確認してください。

PHP+SocketシリーズのIO多重化とWebサーバーの実装 PHP+SocketシリーズのIO多重化とWebサーバーの実装 Feb 02, 2023 pm 01:43 PM

この記事では、php+socket に関する関連知識を提供します。主に IO 多重化と php+socket が Web サーバーを実装する方法を紹介します。興味のある方は以下をご覧ください。皆様のお役に立てれば幸いです。

Pythonのsocketとsocketserverの使い方 Pythonのsocketとsocketserverの使い方 May 28, 2023 pm 08:10 PM

1. TCP プロトコルに基づくソケット プログラミング 1. ソケット ワークフローはサーバー側から始まります。サーバーはまずソケットを初期化し、次にポートにバインドし、ポートをリッスンし、accept を呼び出してブロックし、クライアントが接続するのを待ちます。このとき、クライアントがSocketを初期化してからサーバーに接続(connect)すると、接続に成功するとクライアントとサーバー間の接続が確立されます。クライアントがデータ リクエストを送信し、サーバーがリクエストを受信して​​処理し、次に応答データをクライアントに送信し、クライアントがデータを読み取り、最後に接続を閉じます。インタラクションは終了します。インタラクションを実装するには、次の Python コードを使用します。 :インポートソ

Windows 11 で WMI プロバイダー ホストの CPU 使用率が高い問題を解決する 4 つの簡単なヒント Windows 11 で WMI プロバイダー ホストの CPU 使用率が高い問題を解決する 4 つの簡単なヒント Apr 18, 2023 pm 08:25 PM

WMIProviderHost プロセスは、Windows 11 で重要な役割を果たします。これにより、他のアプリケーションがコンピュータに関する情報を要求できるようになります。 WMIProviderHost に関連するプロセスは通常、バックグラウンドで実行されるため、通常は大量のシステム リソースを消費しません。ただし、このサービスは他のアプリケーションのせいで、時々 CPU パワーの 50% 以上を使用すると報告されています。コンピュータのプロセッサをほぼ最大能力で長時間実行すると、過熱やシステム コンポーネントの損傷につながる可能性があるため、心配です。今日のチュートリアルでは、WMIProviderHost が Windows 11 上の C で動作する理由を見ていきます。

ホストファイルはどこにありますか ホストファイルはどこにありますか Jan 04, 2021 am 11:25 AM

ホスト ファイルはパス「C:\Windows\System32\drivers\etc」にあります。ホスト ファイルはメモ帳などの通常のテキスト編集ソフトウェアで開くことができるプレーン テキスト ファイルです。ホスト ファイルの機能は次のとおりです。 IP アドレスとホスト名とのマッピング関係を含めます。

See all articles