最近取り組んでいるプロジェクトには、時間のかかるタスクをバックグラウンドで実行する必要がある機能がありますが、プロジェクトのメインコードは PHP に基づいているため、バックグラウンドに常駐するデーモンプロセスとしてはあまり適していません。 PHP では、デーモン プロセスがバックグラウンドで実行されている場合、別の言語に変更すると非常に不便になります。そのためWeb側とデーモン部分の通信が絡むことは避けられず、Socketを使うのが良い方法です。
ソケットとは
ソケットの本来の英語の意味は「穴」または「ソケット」です。 BSD UNIX のプロセス通信機構としては後者の意味をとります。一般に「ソケット」とも呼ばれ、IP アドレスとポートを記述するために使用され、通信チェーンへのハンドルです。インターネット上のホストは通常、複数のサービス ソフトウェアを実行し、複数のサービスを同時に提供します。各サービスはソケットを開き、異なるポートに異なるサービスに対応します。
上記のコンテンツは百度百科事典からのものです
簡単に言うと、ソケットはさまざまなサービスがさまざまなポートで通信するのに役立ちます。
PHPでの実装
### サーバー
- set_time_limit(0);
- // ホストとポートを設定します
- $host = "127.0.0.1";
- $port = 12387;
- // tcp ストリームを作成します
- $socket =ソケット_create(AF_INET, SOCK_STREAM, SOL_TCP)
- or die("socket_create() failed:" .socket_strerror(socket_last_error()));
- // ブロックモードを設定します
- socket_set_block($socket)
- or die( " socket_set_block() が失敗しました:" .socket_strerror(socket_last_error()));
- // ポートにバインドします
- socket_bind($socket, $host, $port)
- または die("socket_bind() が失敗しました:" .socket_strerror(socket_last_error( )));
- // リスニングを開始します
- socket_listen($socket, 4)
- or die("socket_listen() failed:" .socket_strerror(socket_last_error()));
- echo "$host でソケットをバインドしています :$ port ... n";
- while (true) {
- // 接続リクエストを受信し、サブ接続ソケットを呼び出してクライアントとサーバー間の情報を処理します
- if (($msgsock =ソケット_accept($socket ) ) < 0) {
- echo "socket_accept() が失敗しました:" .socket_strerror(socket_last_error());
- }else{
- // データを読み取ります
- $out = '';
- while($buf =ソケット_read($msgsock) , 8192)){
- $out .= $buf;
- }
- // データを書き込みます
- $in = "データは $out";
- ソケット_write($msgsock, $in, strlen($in));
- }
- //通信を終了
- socket_close($msgsock);
- }
- socket_close($socket);
- ?>
コードをコピー
サーバーは主に次の手順を実行します:
ソケット リスナーを作成し、接続を待機します。
リンクが到着したら、IO を処理するためにサブ接続を開きます
クライアントから送信データを受信
結果をクライアントに書き戻す
クライアント
- set_time_limit(0);
- $host = "127.0.0.1";
- $port = 12387;
- // TCP ストリームを作成します
- $socket =ソケット_create(AF_INET, SOCK_STREAM, SOL_TCP) )
- または die("socket_create() が失敗しました:" .socket_strerror(socket_last_error()));
- echo "$host:$port...n に接続しようとしました";
- $result =ソケット_connect($socket, $ host, $port)
- または die("socket_connect() が失敗しました:" .socket_strerror(socket_last_error()));
- $in = "こんにちは";
- if(!socket_write($socket, $in, strlen( $ in))) {
- echo "socket_write() が失敗しました:" .socket_strerror($socket);
- }else {
- echo "送信に成功しました!n";
- }
- $out = '';
- while($buf = socket_read($socket, 8192)) {
- $out .= $buf;
- }
- echo "受け入れられたコンテンツは次のとおりです: $out n";
- socket_close($socket);
- ?>
コードをコピー
クライアントは主に次の手順を実行します:
サーバーソケットに接続します
サーバーにデータを書き込む
サーバーからデータを受信する
出典:ヤン・スーのブログ
|