Fork me on GitHub

PHP进阶基础知识剖析(五)之通信神器socket

人若志趣不远,心不在焉,虽学不成。
张载

前言

上一篇我们讲解了php网络通信中的传输利器cURL,同样的,作为在网络中不可或缺的一部分,socket也是必须要了解的。下面,让我们一同探寻PHP与socket的故事~~~

Socket介绍

Socket通常称之为套接字,用于描述ip和端口,是一个通信链的句柄。应用程序中可以通过其向网络发送请求或应答网络请求。socket不是一个程序,也不是一种协议,而是操作系统提供的传输层与应用层之间的一组抽象API。

PHP与Socket

而在PHP中,由于PHP自身是由c语言开发而成,因此,无法涉及到底层API和系统调用。仅仅是将API进行封装之后的调用。

另外,由于历史的缘故,PHP中的socket不像c/java中那般智能,其作为服务器的效率较低,因此一般不用其作为服务器编程的利器,同时PHP的socket中对I/O复用的封装仅仅实现了select,而现阶段大多数服务器采用的epoll模型并未涉及。如果想要用PHP实现网络的高效通信,可以添加swoole扩展,具体介绍请移步:swoole

PHP中Socket原型

原型定义如下:

1
2
3
4
5
6
7
8
SOCKET socket(int af, int type, int protocol);
该函数共有三个参数:
af: 指定应用程序的通信协议族,对于TCP/IP协议族该置为AF_INET
type: 是指创建socket的类型:
包括基于TCP协议的流套接字类型:SOCK_STREAM
基于UDP协议的数据报套接字类型:SOCK_DGRAM
原始套接字类型:SOCK_RAW
protocol:指定使用的通信协议

几种使用socket的方法

  1. 使用原始方式创建一个套接字:
    socket_create(int $domain,int $type,int $protocol)
  1. 使用fsockopen方式:
    fsockopen($host, $port, &errno, &errstr, $timeout)
  1. 使用pfsockopen方式:
    跟fsockopen定义一致,只不过fsockopen是长连接
  1. 使用stream_socket_server/stream_socket_client方式:
    以流方式执行socket

其他方法

其实其他方法和原始c语言中的socket API大同小异,只不过是做了一层封装而已。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
socket_bind ( resource $socket , string $address [, int $port = 0 ] ) : bool//绑定函数

socket_listen ( resource $socket [, int $backlog = 0 ] ) : bool//监听函数

socket_read ( resource $socket , int $length [, int $type = PHP_BINARY_READ ] ) : string//读数据函数

socket_recv ( resource $socket , string &$buf , int $len , int $flags ) : int//接收数据函数

socket_select ( array &$read , array &$write , array &$except , int $tv_sec [, int $tv_usec = 0 ] ) : int//I/O复用的select函数

socket_send ( resource $socket , string $buf , int $len , int $flags ) : int//发送函数

socket_set_block ( resource $socket ) : bool//设置阻塞模式

socket_write ( resource $socket , string $buffer [, int $length = 0 ] ) : int//写数据函数

socket_accept ( resource $socket ) : resource//服务端接受请求函数

socket_connect ( resource $socket , string $address [, int $port = 0 ] ) : bool//客户端连接服务器函数

socket_close ( resource $socket ) : void//关闭套接口资源函数
代码示例

请移步我的github查看示例代码实现c/s聊天室和smtp客户端

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!
0%