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