
图片引用自sockets百度百科词条,tcp通信的流程,其它方式的通信可参考
服务端相关函数
socket_create ( int $domain , int $type , int $protocol ) : resource
$socket = socket_create(AF_INET, SOCK_STREAM, 0);IP4或者IP6或者UNIX本地通讯,配置过nginx的话应该会知道参数fastcgi_pass用来连接php-fpm的,有两种方式,一种是tcp,一种是unix socket,就是对应这里的IP方式和UNIX本地方式SOCK_STREAM(tcp)或者SOCK_DGRAM(udp)或者其它 socket_bind ( resource $socket , string $address [, int $port = 0 ] ) : bool
socket_listen ( resource $socket [, int $backlog = 0 ] ) : bool
listen.backlog ,这个参数就对应着socket_listen中的第二个参数,目前php-fpm默认值是511,而workerman中默认值是102400socket_accept ( resource $socket ) : resource
客户端相关函数
socket_connect ( resource $socket , string $address [, int $port = 0 ] ) : bool
socket_create创建一个socket,然后再调用此函数连接到服务端读写函数
socket_send ( resource $socket , string $buf , int $len , int $flags ) : int
socket_write ( resource $socket , string $buffer [, int $length = 0 ] ) : int
socket_write中引用#ifndef PHP_WIN32来判定如果是非windows系统,则调用系统的write方法来实现,windows系统则调用系统的send方法来实现,但是socket_send则没有判定,统一调用系统的send来实现,不明白socket_write为什么要增加判定?socket_sendto( resource $socket , string $buf , int $len , int $flags , string $addr [, int $port = 0 ] ) : int
socket_recv( resource $socket , string &$buf , int $len , int $flags ) : int
socket_read ( resource $socket , int $length [, int $type = PHP_BINARY_READ ] ) : string
socket_recvfrom ( resource $socket , string &$buf , int $len , int $flags , string &$name [, int &$port ] ) : int
其它常用函数
socket_close ( resource $socket ) : void
socket_set_nonblock( resource $socket ) : bool
socket_set_block( resource $socket ) : bool
socket_connect、socket_accept以及上方的各种读写函数,以socket_accept为例,阻塞就是调用此方法后,如果没有接受到客户端,则此方法一直卡住,等待客户端加入后才会进行下一步动作,而非阻塞则是如果没有客户端加入,则直接返回false,具体的会在后面的IO模型中总结socket_select( array &$read , array &$write , array &$except , int $tv_sec [, int $tv_usec = 0 ] ) : int
<?php
//IP和端口
$address = ‘127.0.0.1‘;
$port = 8888;
//创建
$listenSocket = socket_create(AF_INET, SOCK_STREAM, 0);
//绑定
socket_bind($listenSocket, $address, $port);
//监听
socket_listen($listenSocket, 5);
//循环接入客户端
while (true) {
//接入客户端
$connectSocket = socket_accept($listenSocket);
$msg = "hello\r\n";
//发送给客户端,注意此时用的是$connectSocket,而不是$listenSocket
socket_write($connectSocket, $msg, strlen($msg));
//关闭
socket_close($connectSocket);
}
//关闭
socket_close($listenSocket);
<?php
//服务端IP和端口
$address = ‘127.0.0.1‘;
$port = 8888;
//创建
$socket = socket_create(AF_INET, SOCK_STREAM, 0);
//连接
$result = socket_connect($socket, $address, $port);
//读取
$out = socket_read($socket, 2048);
echo $out;
//关闭
socket_close($socket);
php socket_service.php,然后再新起一窗口运行php socket_client.php就能看到客户端联通后收到了服务端发送的数据并显示出来。telnet来链接,会发现只有一个结束后,另一个才能接入),解决方法就是可以用fork子进程或者是IO多路复用,后续会总结。php socket网络编程基础知识(二):socket函数
原文:https://www.cnblogs.com/vishun/p/10469773.html