現在の位置: ホーム> 最新記事一覧> PHPでsocket_listen関数を使用する方法は?監視をオンにするための正しい姿勢の詳細な説明

PHPでsocket_listen関数を使用する方法は?監視をオンにするための正しい姿勢の詳細な説明

gitbox 2025-06-25

PHPでは、 Socket_Listen関数を使用して作成されたソケットを設定してリッスンし、ソケットが着信接続要求を受信できるようにします。通常、この関数は、 socket_createおよびsocket_bindで使用され、クライアントリクエストを処理するための完全なサーバーソケットを構築します。この記事では、 socket_listen関数の使用法を詳細に分析し、正しくリスニングをオンにする方法について導きます。

1。socket_listen関数の基本的な使用

関数プロトタイプ:

 <span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_listen</span></span><span> ( resource </span><span><span class="hljs-variable">$socket</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$backlog</span></span><span> = </span><span><span class="hljs-number">0</span></span><span> )
</span></span>
  • $ socketsocket_createを介して作成され、 socket_bindを介してアドレスとポートにバインドされたソケットリソース。

  • $バックログ:保留中の接続要求の最大数を指定します。オペレーティングシステムのカーネルによって許可されている未処理の接続のキューの長さを定義します。キューがいっぱいの場合、新しい接続要求は拒否されます。共通の値は128ですが、要件に従って調整できます。

返品値:

  • 成功したら、 0を返します。

  • 障害時にfalseが返され、 socket_last_error()を介してエラー情報を取得できます。

2。socket_listen関数の使用方法

socket_listenを使用するには、通常、 socket_createを介してソケットを作成し、指定されたIPアドレスとsocket_bindを使用してポートにバインドする必要があります。次に、 socket_listenを使用して、このソケットにクライアントからの接続要求のリスニングを開始できます。これが基本的なサーバーの例です。

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 作成するTCPソケット</span></span><span>
</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$socket</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"无法作成するソケット: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
    </span><span><span class="hljs-keyword">exit</span></span><span>();
}

</span><span><span class="hljs-comment">// 指定されたものにバインドしますIPアドレスとポート</span></span><span>
</span><span><span class="hljs-variable">$address</span></span><span> = </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>;
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">8080</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_bind</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$address</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"バインディングは失敗しました: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
    </span><span><span class="hljs-keyword">exit</span></span><span>();
}

</span><span><span class="hljs-comment">// 开始监听ソケット</span></span><span>
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_listen</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"リスニングが失敗しました: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
    </span><span><span class="hljs-keyword">exit</span></span><span>();
}

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"サーバーは聞いています <span class="hljs-subst">$address</span></span></span><span>:</span><span><span class="hljs-subst">$port</span></span><span>...\n";

</span><span><span class="hljs-comment">// 接続を受信します</span></span><span>
</span><span><span class="hljs-variable">$clientSocket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_accept</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$clientSocket</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"接続を受信します失败: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
    </span><span><span class="hljs-keyword">exit</span></span><span>();
}

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"クライアントが接続されています\n"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$clientSocket</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

この例では:

  1. socket_create経由でTCPソケットを作成します。

  2. Socket_Bindを使用して、ソケットを127.0.0.1:8080 、つまりローカルアドレスのポート8080にバインドします。

  3. socket_listenを呼び出して接続要求の聴取を開始し、2番目のパラメーター5は許可されている未処理の接続の最大数を示します。

  4. socket_acceptを使用して、クライアントからの接続を受け入れます。

3。パラメーター分析:バックログパラメーター

socket_listenの2番目のパラメーターバックログは、カーネルの接続キューの長さを指定します。このキューは、 socket_acceptによって受け入れられていない接続を保存します。このパラメーターの方が大きいほど良いことに注意する必要があります。より高い値をより多くの待機接続に対応するように設定できますが、これはより多くのシステムリソースを占有することもあり、設定が大きすぎて処理能力がない場合、リソースの無駄につながる可能性があります。

一般的なバックログ値:

  • 128 :これは一般的なデフォルト値であり、ほとんどのアプリケーションシナリオに適しています。

  • 00に設定すると、システムはデフォルトのキュー長を使用します。一般的に言えば、 0の値を心配する必要はありません。

4.エラー処理とデバッグ

ネットワークをプログラミングするとき、エラーは避けられません。 socket_listenが故障するとfalseを返します。 socket_last_errorを使用して、簡単にデバッグするために詳細なエラー情報を取得できます。例えば:

 <span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
    </span><span><span class="hljs-variable">$errorCode</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"リスニングが失敗しました, エラーコード: <span class="hljs-subst">$errorCode</span></span></span><span>, エラーメッセージ: " . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-variable">$errorCode</span></span><span>) . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span></span>

このコードは、より詳細なエラー情報を返して、問題のトラブルシューティングに役立ちます。

5。注意すべきこと

  • 非ブロッキングモード:リスニング中にソケットをプログラムをブロックしないようにしたい場合は、 socket_set_nonblock関数を使用してソケットを非ブロッキングモードに設定できます。

  • MultiThreaded/Multi-Process :多数の同時接続を扱う場合、メインスレッドをブロックせずに複数のクライアント接続を処理するために、マルチプロセスまたはマルチスレッドモデル( PCNTL_FORKまたはPTHREADS拡張など)を使用することを検討することができます。

  • クリーニング:ソケットを使用した後、 socket_closeに電話してソケットを閉じてリソースをリリースすることを忘れないでください。

6。概要

Socket_Listenは、PHPソケットプログラミングにおいて非常に重要な機能です。バウンドソケットを設定して、クライアントが接続するのを待つ責任があります。 socket_listenを正しく使用すると、PHPアプリケーションがクライアントからの接続要求を処理し、安定したネットワークサービスを提供できるようにします。バックログパラメーターが正しく設定され、エラーが適切に処理されていることを確認してください。これにより、アプリケーションの信頼性と安定性が効果的に向上します。