ホームページ  >  記事  >  バックエンド開発  >  PHP のソケットの基礎知識

PHP のソケットの基礎知識

墨辰丷
墨辰丷オリジナル
2018-06-07 15:27:031405ブラウズ

この記事では、PHP における Socket の基礎知識を中心に紹介しますので、興味のある方は参考にしていただければ幸いです。

TCP/IP と UDP とは何ですか?

TCP/IP (伝送制御プロトコル/インターネット プロトコル) は、ワイド エリア ネットワーク (WAN) 用に設計された業界標準のプロトコル セットです。
UDP(User Data Protocol、User Datagram Protocol)は、TCPに相当するプロトコルです。これは、TCP/IP プロトコル スイートのメンバーです。
ここに、これらの契約間の関係を示す図があります。

2015811151417312.jpg (596×448)

TCP/IP プロトコル スイートには、トランスポート層、ネットワーク層、およびリンク層が含まれます。これで、TCP/IP と UDP の関係がわかりました。
ソケットはどこですか? 図 1 では、Socket の影が見えませんが、それはどこにあるのでしょうか?写真を使ってわかりやすく話しましょう。

2015811151446490.jpg (542×476)

ソケットがここにあることがわかりました。
ソケットとは何ですか? ソケットは、アプリケーション層と TCP/IP プロトコル スイート間の通信のための中間ソフトウェア抽象化層であり、一連のインターフェイスです。設計モードでは、Socket は実際にはファサード モードであり、複雑な TCP/IP プロトコル ファミリを Socket インターフェイスの背後に隠し、ユーザーにとっては一連の単純なインターフェイスだけで、指定されたプロトコルを満たすように Socket がデータを編成できます。
使用しますか? 先人たちは私たちのために多くのことをしてくれ、ネットワーク間の通信ははるかに簡単になりましたが、結局のところ、やるべきことはまだたくさんあります。以前ソケットプログラミングについて聞いたとき、比較的高度なプログラミング知識だと思っていましたが、ソケットプログラミングの動作原理を理解すれば、その謎は解けます。
人生の一場面。友人に電話したい場合は、最初にその番号をダイヤルします。呼び出し音が聞こえたら、友人は電話に出ます。この時点で、あなたと友人は接続され、通話できます。通話が終了したら電話を切って会話を終了します。 TCP/IP プロトコル ファミリは人生の中で誕生したのかもしれませんが、必ずしもそうではありません。

2015811151507191.jpg (478×491)

PHP でのソケット プログラミングの概要php5.3 には、php にソケット通信機能を持たせるためのソケット モジュールが付属しています。特定の API については、こちらをご覧ください。公式マニュアルを参照してください: http://php.net/manual/zh/function.socket-create.php。具体的な実装は、メモリ割り当てとネットワークの基礎となる 操作が欠けていることを除いて、c と非常によく似ています。バイトオーダー変換

同時に、PHP の pcntl モジュールと posix モジュールは、基本的なプロセス管理、信号処理、その他のオペレーティング システム レベルの機能を実現できます。ここには、pcntl_fork() と posix_setsid() という 2 つの非常に重要な関数があります。プロセスをフォーク () することは、実行中のプロセスのコピーを作成することを意味し、そのコピーは子プロセスとみなされ、元のプロセスは親プロセスとみなされます。 fork() の実行後、fork() を開始したプロセスおよび端末コントロールから分離できます。これは、親プロセスが自由に終了できることも意味します。 pcntl_fork() の戻り値。-1 は実行失敗を示し、0 は子プロセス内を示し、0 より大きい場合は親プロセス内を示します。 setit() は、最初に新しいプロセスを新しいセッションの「リーダー」にし、最後にプロセスが端末を制御しなくなります。これはデーモン プロセスになるための最も重要なステップでもあり、ターミナルが閉じられたときにプロセスが強制終了されないことを意味します。これは、中断できない常駐プロセスにとって重要なステップです。最後の fork() を実行します。この手順は必須ではありませんが、通常は、制御端末が取得されないようにするために実行されます。デーモンは通常、端末を制御しないバックグラウンド タスクとして考えられます。これには、次の 3 つの明らかな特徴があります。

    バックグラウンドで実行される
  1. # 開始プロセスから切り離される
  2. # 端末制御は不要です
  3. 最も一般的な実装メソッド: fork() ->() -> コード内の run_server() メソッドデーモンプロセスを実装します。

サーバー側ソケット監視コード

  <?php 
   
  // 接受客户端请求,回复固定的响应内容 
  function server_listen_socket ($address, $port) 
  { 
    $buffer = "Msg from wangzhengyi server, so kubi..."; 
    $len = strlen($buffer); 
     
    // create, bind and listen to socket 
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
    if (! $socket) { 
      echo "failed to create socket:" . socket_strerror($socket) . "\n"; 
      exit(); 
    } 
     
    $bind_flag = socket_bind($socket, $address, $port); 
    if (! $bind_flag) { 
      echo "failed to bind socket:" . socket_strerror($bind_flag) . "\n"; 
      exit(); 
    } 
     
    $backlog = 20; 
    $listen_flag = socket_listen($socket, $backlog); 
    if (! $listen_flag) { 
      echo "failed to listen to socket:" . socket_strerror($listen_flag) . "\n"; 
      exit(); 
    } 
     
    echo "waiting for clients to connect\n"; 
     
    while (1) { 
      if (($accept_socket = socket_accept($socket)) == FALSE) { 
        continue; 
      } else { 
        socket_write($accept_socket, $buffer, $len); 
        socket_close($accept_socket); 
      } 
    } 
  } 
   
  function run_server () 
  { 
    $pid1 = pcntl_fork(); 
    if ($pid1 == 0) { 
      // first child process 
       
      // 守护进程的一般流程:fork()->setsid()->fork() 
      posix_setsid(); 
       
      if (($pid2 = pcntl_fork()) == 0) { 
        $address = "192.168.1.71"; 
        $port = "8767"; 
        server_listen_socket($address, $port); 
      } else { 
        // 防止获得控制终端 
        exit(); 
      } 
    } else { 
      // wait for first child process exit 
      pcntl_wait($status); 
    } 
  } 
   
  // server守护进程 
  run_server();

実行効果

サーバー側ソケット プロセスを開始して、バックグラウンドで実行されているかどうかを確認します。効果は次の図に示されています。

2015811151526030.png (985×174)クライアント アクセスはブラウザまたはcurlを介してアクセスできます。ここでは、curlを使用して直接アクセスします

#。

2015811151634550.png (930×64)#要約 :

以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。

関連提案:

PHP マジック関数とマジック定数の使用方法

PHP マジック メソッド __call および __callStatic の使用方法

PHP 方法大きな CSV ファイルを読み取り、データベースにインポートするには

以上がPHP のソケットの基礎知識の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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