PHP Socket Server

<?php
02if (php_sapi_name() != 'cli') {
03 exit("run 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);
10set_time_limit(0);
11 
12# 记录文件
13$recvfile = './recv.txt';
14 
15# 心跳标记
16$heartag = "\r\n";
17 
18# 数组长度
19$datalen = 1024 * 1024;
20 
21$ip = '192.168.125.233';
22$port = 12345;
23 
24# IPv4, 流, TCP
25$sockect = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
26# 绑定服务端必须的
27if (!socket_bind($sockect, $ip, $port)) {
28 exit("socket bind fail\n");
29}
30 
31# 监听
32socket_listen($sockect);
33# 不阻塞
34socket_set_nonblock($sockect);
35 
36$clients = array();
37 
38while (true) {
39 # 接收客户端连接
40 $client = socket_accept($sockect);
41 if (is_resource($client)) {
42  # 触发心跳
43  socket_write($client, $heartag, strlen($heartag));
44  $clients[] = $client;
45  printf("client index:%d\n", 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    # 接收客户端数据 注意:第四个参数必须为零,这跟手册上不一样,还没搞明白
54    if (socket_recv($client, $recvstr, $datalen, 0) === 0) {
55     socket_close($client);
56     socket_shutdown($client);
57     unset($clients[$idx]);
58     continue;
59    }
60 
61    if ($recvstr == $heartag) {
62     # 触发心跳
63     socket_write($client, $heartag, strlen($heartag));
64    } elseif (trim($recvstr) != "") {
65     # 输出接收的消息
66     $stdmsg = sprintf("%d:%s\n", $idx, $recvstr);
67     file_put_contents($recvfile, $stdmsg, FILE_APPEND);
68     echo $stdmsg;
69    }
70   }
71   unset($recvstr, $idx);
72  }
73 }
74 # 要睡多久?这是个问题,不睡 CPU 很累, 内存吃的厉害
75 usleep(50000);
76}
77 
78socket_close($sockect);
79socket_shutdown($sockect);
80?>



http://my.oschina.net/oodbqpoo/blog/68492

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值