現在の位置: ホーム> 最新記事一覧> Socket_set_blockはstream_set_blockingとどう違うのですか?

Socket_set_blockはstream_set_blockingとどう違うのですか?

gitbox 2025-05-26

PHPでは、ネットワーク通信を処理する際には、ブロッキングモードと非ブロッキングモードの制御が非常に重要です。 socket_set_blockおよびstream_set_blockingは、一般的に使用される2つの関数です。どちらもソケットやストリームのブロッキング動作を設定するために使用されますが、該当するオブジェクトと使用量にはいくつかの違いがあります。この記事では、これら2つの機能とその使用方法の違いを詳細に紹介します。

1。基本概念

  • ブロッキングモード:ファンクションコールは、データが読み取られるまでデータを読み取るなど、操作が完了するのを待機し、送信が完了するまでデータを書き込み、プログラムが一時停止して待機します。

  • 非ブロッキングモード:機能呼び出しは、操作が完了するのを待ちません。操作をすぐに完了できない場合、すぐに戻り、プログラムは他のタスクを実行し続けることができます。

2。関数の紹介

1。Socket_set_block

  • 適用可能: PHPソケット拡張機能のソケットリソースsocket_create()などの機能を介して作成)

  • 機能:ソケットをブロッキングモードに設定します。

  • 関数プロトタイプ:

     bool socket_set_block(resource $socket)
    
  • 返品値:成功のためにtrueを返す、失敗のためにfalseを返す

2。Stream_set_blocking

  • 適した: Fopen()Stream_Socket_Client()によって返されるリソースなどのストリームベースのリソース、またはsocket_import_stream ()を介してsocket_create()によって変換されたストリームリソース。

  • 機能:フローのブロッキングモードを設定します。

  • 関数プロトタイプ:

     bool stream_set_blocking(resource $stream, int $mode)
    
  • パラメーター:

    • $ストリーム:ストリーミングリソース

    • $モード:1はブロッキングを意味し、0は非ブロッキングを意味します

  • 返品値:成功のためにtrueを返す、失敗のためにfalseを返す

3。主な違い

特性socket_set_block stream_set_blocking
適用可能なリソースソケット拡張機能のソケットリソースPHPストリーミングリソース(ファイルストリーム、ネットワークストリームなど)
ブロッキングモード設定方法追加のパラメーターなしで直接呼び出します2番目のパラメーター(0または1)でブロッキングモードを指定します
使用法の柔軟性ブロッキングのみを設定できますブロッキングまたは非ブロッキングを設定できます
適用可能なシナリオ低レベルのソケットプログラミング高レベルのネットワークフロープログラミング

4.サンプルコード

1。Socket_set_blockを使用します

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create failed: " . socket_strerror(socket_last_error()));
}

socket_set_block($socket); // ブロッキングモードに設定します

// サーバーに接続します
socket_connect($socket, "gitbox.net", 80);

// リクエストを送信します
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request, strlen($request));

// 応答を読んでください
$response = '';
while ($out = socket_read($socket, 2048)) {
    $response .= $out;
}

echo $response;

socket_close($socket);
?>

2。Stream_set_blocking使用します

<?php
$stream = stream_socket_client("tcp://gitbox.net:80", $errno, $errstr, 30);
if (!$stream) {
    die("Connection failed: $errstr ($errno)");
}

// ブロッキングモードに設定します
stream_set_blocking($stream, 1);

// リクエストを送信します
fwrite($stream, "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n");

// 応答を読んでください
$response = '';
while (!feof($stream)) {
    $response .= fread($stream, 2048);
}

echo $response;

fclose($stream);
?>

5。概要

  • Socket_set_blockは、PHPのソケット拡張機能のソケットリソースに特別に使用され、ソケットをブロッキング状態に直接設定します。

  • Stream_set_blockingは、より広い範囲のストリームリソースに適しており、ブロッキングモードと非ブロッキングモードの柔軟なスイッチングを提供します。

  • 選択する関数は、主に使用するリソースのタイプに依存します。ソケットを使用してソケットを管理する場合は、 socket_set_blockを使用します。ストリームリソース( Stream_Socket_Clientなど)を使用する場合は、 Stream_set_blockingを使用します。

これらの2つの機能とその違いを理解することで、PHPネットワークプログラミングのデータの読み取りと書き込みのデータをよりよく制御し、プログラムのパフォーマンスと応答を最適化します。