Socket函数
socket
socket_create
函数 resource socket_create(int $domain,int $type,int $protocol)domain: AF_INET、AF_INET6、AF_UNIX,*AF (address family)地址族*。
type: SOCK_STREAM、SOCK_DGRAM等,常用SOCK_STREAM,基于字节流的SOCKET类型,也是TCP协议使用的类型
protocol: SOL_TCP、SOL_UDP
socket_bind
函数: bool socket_bind(resource $socket,string $address[,int $port=0])socket: 使用 socket_create 创建的socket资源
address: ip 地址
port: 监听的端口号,web服务器通常为80端口
socket_listen
函数 bool socket_listen(resource $socket[,int $bcklog=0])socket: 使用 socket_create 创建的socket资源
backlog: 等待处理连接队列的最大长度
socket_acccept
函数: resource socket_accept(resource $socket)socket: 使用socket_create创建的socket资源
socket_write
函数: int socket_write(resource $socket,string $buffer[,int $length])socket: 调用 socket_accept 接收的新连接产生 socket 资源
buffer: 写入到 socket 资源中的数据
length: 控制写入到 socket 资源中的 buffer 的长度,如果长度大于 buffer 的容量,则取 buffer 的容量。
socket_close
函数: void socket_close(resource $socket)socket: socket_accept 或者 socket_create 产生的资源,不能用于 stream 资源的关闭。1
2
3
4
5
6
7
8
9
10
11$sock=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);//创建socket资源
socket_bind($sock,"127.0.0.1",80);//绑定端口
socket_listen($sock);//监听端口
for(;;){
$sock=socket_accept($sock);//接收向端口发出的请求
$write_buffer="HTTP/1.0 200 OKrnServer: my_serverrnContent-Type: text/html; charset=utf-8rnrnhello!world";
$socket_write($conn,$write_buffer);//写入数据到socket中
$socket_close($conn);
}
运行:1php server.php
socket_stream
stream_socket_server
一次性创建、绑定端口、监听端口
函数: resource stream_socket_server ( string $local_socket [, int &$errno [, string &$errstr [, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN [, resource $context ]]]] )local_socket: 协议名://地址:端口号
errno: 错误码
errstr: 错误信息
flags: 只使用该函数的部分功能
context: 使用stream_context_create函数创建的资源流上下文
stream_socket_accept
函数: resource stream_socket_accept ( resource $server_socket [, float $server_socket[,float timeout = ini_get("default_socket_timeout") [, string &$peername ]] )server_socket: 使用stream_socket_server创建的stream资源
timeout: 超时时间
peername: 设置客户端主机名称1
2
3
4
5
6
7
8
9// server.php
$sock = stream_socket_server("tcp://127.0.0.1:80", $errno, $errstr);
for ( ; ; ) {
$conn = stream_socket_accept($sock);
$write_buffer = "HTTP/1.0 200 OKrnServer: my_serverrnContent-Type: text/html; charset=utf-8rnrnhello!world";// http 头信息
fwrite($conn, $write_buffer);
fclose($conn);
}
Note:stream_socket_server和socket_create创建的不是同一种资源,stream_socket_server创建的是stream资源,可以用fwrite、fread、fclose操作该资源. socket_create创建的是socket资源,不是stream资源,所以socket_create创建的资源只能用socket_write、socket_read、socket_close来操作
多进程函数
pcntl_fork
函数:int pcntl_fork(void);
pcntl_fork 会复制当前进程产生另一个进程,称为当前进程的子进程。父进程和子进程都会在该函数后继续运行,该函数在父进程和子进程中的返回值不相同,在父进程中返回的是 fork 出的子进程的进程ID,而在子进程中返回的是0,创建子进程失败时返回-1,创建成功的子进程会复制父进程的数据(堆、栈、静态数据)
pcntl_waitpid 等待返回fork的子进程状态
函数:int pcntl_waitpid(int $pid,int &$status[,int $options=0])
挂起当前进程的执行一直到 pid 指定的进程退出,亦或接收一个信号中断当前进程、调用一个信号处理函数。