ホームページ >バックエンド開発 >PHPチュートリアル >PHPソケットプログラミングの詳しい説明
私が最近取り組んでいるプロジェクトには、時間のかかるタスクをバックグラウンドで実行する必要がある機能がありますが、プロジェクトのメインコードは PHP に基づいているため、PHP は永続的なバックグラウンド デーモンとしてはあまり適していません。バックグラウンドで実行されている場合、デーモンが別の言語に変更されると非常に不便になります。そのためWeb側とデーモン部分の通信が絡むことは避けられず、Socketを使うのが良い方法です。
socket の本来の英語の意味は「穴」または「ソケット」です。 BSD UNIX のプロセス通信機構としては後者の意味をとります。一般に「ソケット」とも呼ばれ、IP アドレスとポートを記述するために使用され、通信チェーンへのハンドルです。インターネット上のホストは通常、複数のサービス ソフトウェアを実行し、複数のサービスを同時に提供します。各サービスはソケットを開き、異なるポートに異なるサービスにバインドされます。
上記の内容は Baidu Encyclopedia からのものです
簡単に言えば、ソケットは異なるサービスが異なるポートで通信するのに役立ちます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
set_time_limit(0);
// ホストとポートを設定
$host = "127.0.0.1" ;
// TCP ストリームを作成
$socket =ソケット_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 )
or die ( "socket_bind() failed:" .socket_strerror (socket_last_error( )));
// リスニングを開始
ソケット_listen( $socket , 4)
or die ( "socket_listen() failed:" .ソケット_strerror(socket_last_error()));のソケット on $host:$port ... n" ;
while (true) {
// 接続リクエストを受信し、サブ接続ソケットを呼び出してクライアントとサーバー間の情報を処理します
if (( $msgsock =ソケット_accept( $socket )) < 0) {
echo "socket_accept() が失敗しました:" 。ソケット_strerror(socket_last_error());
} else {
// 读データ
$out = '' ;
while ( $buf =ソケット_read( $msgsock ,8192)){
$out .= $buf ;
}
// 写データ
$in = "データは $out" ;
ソケット_write( $msgsock , $in , strlen ( $in ));
}
// 结束通信
ソケット_close( $msgsock );
}
socket_close( $socket );
?>
服务端主行了以下步骤:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
set_time_limit(0);
$host = "127.0.0.1" ;
$ポート = 12387;
// 创建一tcp流
$socket =ソケット_create(AF_INET, SOCK_STREAM, SOL_TCP)
または、死ぬ ( "socket_create() failed:" .socket_strerror(socket_last_error())) ;
echo "$host:$port...n に接続してみます" ;
$result =ソケット_connect( $socket , $host , $port )
or die ( "socket_connect() failed:" .socket_strerror(socket_last_error()));
$in = "こんにちは" ;
if (!socket_write( $socket , $in , strlen ( $in ))) {
echo "socket_write() failed:" 。ソケット_strerror( $socket );
} else {
echo "発行成功!n" ;
}
$out = '' ;
while ( $buf =socket_read( $socket , 8192)) {
$out .= $buf ;
}
echo "受け入れられたコンテンツは: $out n" ;
ソケット_close( $socket );
クライアントは主に次の手順を実行します。サーバーソケット
サーバーへのデータの書き込み サーバーからのデータの受信