PHP Socket实现websocket(三)Stream函数
除了socket函数也可以使用stream函数来实现服务器与客户端。
参考PHP 的Stream实现服务器客户端模型:
http://php.net/manual/en/book.stream.php
http://blog.csdn.net/shagoo/article/details/6396089
服务器端代码:
1 <?php 2 //设置不超时 3 set_time_limit(0); 4 5 class SocketServer 6 { 7 public function __construct($port) 8 { 9 global $errno, $errstr; 10 11 $socket = stream_socket_server('tcp://127.0.0.1:'.$port, $errno, $errstr); 12 while($conn = stream_socket_accept($socket, -1)) 13 { 14 $buff = ''; 15 $data = ''; 16 17 //读取请求数据直到遇到\r\n结束符 18 while(!preg_match('#\r\n#', $buff)) 19 { 20 $buff = fread($conn, 1024); 21 $data .= preg_replace('#\r\n#', '', $buff); 22 } 23 fwrite($conn, $data); 24 fclose($conn); 25 } 26 fclose($socket); 27 } 28 } 29 30 new SocketServer(1212);
客户端
1 <?php 2 3 if(isset($argv[1])) 4 { 5 $msg = $argv[1]; 6 $socket = stream_socket_client('tcp://127.0.0.1:1212', $errno, $errstr); 7 if(!$socket) 8 { 9 die($errno.$errstr); 10 } 11 else 12 { 13 // stream_set_blocking($socket, 0); 14 for($index = 0; $index < 3; $index++) 15 { 16 fwrite($socket, " client: $msg $index "); 17 usleep(100000); 18 } 19 fwrite($socket, "\r\n"); 20 $response = fread($socket, 1024); 21 file_put_contents('log.txt', date("[H:i:s] ", time()).$response."\n", FILE_APPEND); 22 fclose($socket); 23 } 24 } 25 else 26 { 27 for($index = 0; $index < 3; $index++) 28 { 29 system('PHP '.__FILE__." $index:test"); 30 } 31 }
cli下运行效果
去掉13行的设置非阻塞模式的代码后,客户端由于设置了usleep()延时,无法写入服务器返回的数据。
当然在客户端不在乎接受结果的情况下,可以使用非阻塞模式来获得最大效率。