PHP 网络编程socket

简介

一,Socket 扩展是基于流行的 BSD sockets,实现了和 socket 通讯功能的底层接口,它可以和客户端一样当做一个 socket 服务器。
PHP两种创建socket方法:
1,stream_socket_server 方法创建 Internet 或 Unix 域服务器套接字。(PHP层封装)
2,socket_create 方法创建一个套接字(通讯节点)。(socket模块需要额外开启)

二,Socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口。
在这里插入图片描述
三,套接字的特性有三个属性
1,域(domain),域名端口。
2,类型(type),SOCK_STREAM(tcp)、SOCK_DGRAM(udp)、SOCK_RAW(原始)。
3,和协议(protocol)。

缓冲

网络中通信数据并不是直接传递到程序,而是放入缓冲区,当缓冲区数据积累到一定的量后有TCP协议底层负责处理,read()/recv()读取缓冲区数据,write()/send()发送数据到缓冲区。

如果机器突然结束工作可能会造成缓冲区中的数据丢失。

在这里插入图片描述

例子

使用PHP stream_socket_server 方法创建套接字。

// TCP 服务器套接字
$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
if (!$socket) {
  echo "$errstr ($errno)<br />\n";
} else {
  while ($conn = stream_socket_accept($socket)) {
    fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "\n");
    fclose($conn);
  }
  fclose($socket);
}
// UDP 服务器套接字
$socket = stream_socket_server("udp://127.0.0.1:1113", $errno, $errstr, STREAM_SERVER_BIND);
if (!$socket) {
    die("$errstr ($errno)");
}

do {
    $pkt = stream_socket_recvfrom($socket, 1, 0, $peer);
    echo "$peer\n";
    stream_socket_sendto($socket, date("D M j H:i:s Y\r\n"), 0, $peer);
} while ($pkt !== false);

学习workman原理

workman底层实现的方式是使用 stream_socket_server

Workerman\Worker 类

在这里插入图片描述

参考

https://www.php.net/manual/zh/book.sockets.php
https://blog.csdn.net/qq_42606136/article/details/115863353
https://mp.weixin.qq.com/s/VazobOgY9QVaADpEur81ng

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值