ホームページ >バックエンド開発 >PHPチュートリアル >PHP ソケットサーバー_PHP チュートリアル
01
02
if (php_sapi_name() != 'cli') {
03
exit("cli を実行");
04
}
05
06
# php.ini の error_reporting 設定は生死を左右します
07
# while(true) は激しすぎるため、ログの書き込みに高い IO が占有されます
08
//ini_set('error_reporting', E_ERROR);
09
//ini_set('display_errors', 0);
10
set_time_limit(0);
11
12
# ログファイル
13
$recvfile = './recv.txt';
14
15
#ハートビートマーク
16
$heartag = "rn";
17
18
#配列の長さ
19
$datalen = 1024 * 1024;
20
21
$ip = '192.168.125.233';
22
$ポート = 12345;
23
24
# IPv4、ストリーミング、TCP
25
$sockect =socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
26
# サーバーをバインドするために必要です
27
if (!socket_bind($sockect, $ip, $port)) {
28
exit("ソケットのバインドに失敗しました");
29
}
30
31
#モニター
32
ソケットリッスン($sockect);
33
#ブロック禁止
34
socket_set_nonblock($sockect);
35
36
$clients = array();
37
38
while (true) {
39
#クライアント接続を受信します
40
$client =ソケット_accept($sockect);
41
if (is_resource($client)) {
42
#心拍数をトリガー
43
socket_write($client, $heartag, strlen($heartag));
44
$clients[] = $client;
45
printf("クライアントインデックス:%dn", count($clients));
46
}
47
unset($client);
48
49
if (!empty($clients)) {
50
foreach ($clients AS $idx => &$client) {
51
if (is_resource($client)) {
52
$recvstr = '';
53
# クライアントデータを受信する 注: 4 番目のパラメーターはゼロでなければなりません。これはマニュアルと異なり、まだ理解していません
54
If (socket_recv($client, $recvstr, $datalen, 0) === 0) {
55
socket_close($client);
56
socket_shutdown($client);
57
unset($clients[$idx]);
58
続けてください;
59
}
60
61
If ($recvstr == $heartag) {
62
# ハートビートをトリガーする
63
socket_write($client, $heartag, strlen($heartag));
64
elseif (trim($recvstr) != "") {
65
# 受信したメッセージを出力します
66
$stdmsg = sprintf("%d:%sn", $idx, $recvstr);
67
File_put_contents($recvfile, $stdmsg, FILE_APPEND);
68
エコー $stdmsg;
69
}
70
}
71
unset($recvstr, $idx);
72
}
73
}
74
#どれくらい寝たいですか?これは問題です、スリープしないとCPUが非常に疲れてメモリが食われてしまいます
75
usleep(50000);
76
}
77
78
ソケットクローズ($sockect);
79
ソケットシャットダウン($sockect);
80
?>
作者: oodbqpoo