用php模拟做服务端侦听端口

简介: 参考:http://www.cnblogs.com/thinksasa/archive/2013/02/26/2934206.html   http://blog.csdn.net/alongken2005/article/details/8056910   socket_accept()是服务端接受客户端请求,一旦有一个客户端链接上来的话,则这个函数会返回一个新的socket资源,这个资源是与客户端通信的资源。

 

参考:http://www.cnblogs.com/thinksasa/archive/2013/02/26/2934206.html

 

http://blog.csdn.net/alongken2005/article/details/8056910

 

socket_accept()是服务端接受客户端请求,一旦有一个客户端链接上来的话,则这个函数会返回一个新的socket资源,这个资源是与客户端通信的资源。

 socket_accept()是阻塞的,会一直卡在那里。

 

 

发现情况:一旦客户端断开链接了,会影响到服务端的主进程。如何避免这个影响呢?

 

正常的服务器,应该是新开一个子进程来处理请求。

 

socket_connect()是链接一个socket去。是客户端使用的。

 

c语言的介绍:connect, send, recv都是同步阻塞工作模式。

 那么,可以得出结论,socket_connect()也是阻塞性的。

 

php中使用协程:

http://www.laruence.com/2015/05/28/3038.html

 

socket_recv和socket_read($msgsock, 2048, PHP_NORMAL_READ)

有什么区别呢?

 

stream_select()

接受一个socket流,可以多个,一个数组形式。

等待这些流改变了状态。改变了状态,则会返回大于0的一个值



<?php
/* Prepare the read array */
$read   = array($stream1, $stream2);//创建的两个socket
$write  = NULL;
$except = NULL;
if (false === ($num_changed_streams = stream_select($read, $write, $except, 0))) {
    /* Error handling */
} elseif ($num_changed_streams > 0) {
    /* At least on one of the streams something interesting happened */
}
?>


要使用引用传递,值会被修改。

 

php多路复用参考资料:http://blog.csdn.net/phphot/article/details/2020269

 

总结


如果没有安装socket扩展,则使用如下相关函数:stream_socket_client、fread()、fwrite()、stream_select()、fclose()

如果安装了sokcet扩展,则可以替换掉扩展的函数:

stream_socket_client等价于socket_create()

socket_select()等价于stream_select()

socket_close()等价于fclose()

socket_write()等价于fwrite()

socket_read()等价于fread()

 

stream_socket_client()实际上是在调用linux系统的 connect()函数。

socket_select()、stream_select()都是在调用操作系统提供的select()函数。

 

 思考:stream和socket本质有什么区别呢?

 不知道,想着去去思考socket_accept和socket_listen()区别,也许就能找到答案了。

 

我总把socket_accept和socket_listen()进行混淆了。

 

socket_accept是开始接受客户端的链接,如果有客户端链接上来,这个函数会返回一个socket通道的句柄,这个句柄是专门与客户端单独的句柄。socket_listen是开始侦听这个socket通道,只是侦听,并不是接受客户端的连接请求。

 

目录
相关文章
|
缓存 NoSQL 网络安全
【Azure Redis 缓存】Azure Redis服务开启了SSL(6380端口), PHP如何访问缓存呢?
【Azure Redis 缓存】Azure Redis服务开启了SSL(6380端口), PHP如何访问缓存呢?
238 0
|
9月前
|
前端开发 Java 测试技术
PHP的现代复兴:从脚本语言到企业级服务端引擎的演进之路-优雅草卓伊凡
PHP的现代复兴:从脚本语言到企业级服务端引擎的演进之路-优雅草卓伊凡
175 6
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
462 20
|
12月前
|
网络协议 Unix 应用服务中间件
|
监控 关系型数据库 MySQL
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
430 0
|
SQL 安全 关系型数据库
PHP作为一种流行的服务端脚本语言,在Web开发领域具有显著的优势
【10月更文挑战第11天】PHP作为一种流行的服务端脚本语言,在Web开发领域具有显著的优势
195 0
|
JSON 安全 API
实战指南:使用PHP构建高性能API接口服务端
构建RESTful API的简要指南:使用PHP和Laravel,先安装Laravel并配置数据库,接着在`api.php`中定义资源路由,创建`PostController`处理CRUD操作,定义`Post`模型与数据库交互。使用Postman测试API功能,如创建文章。别忘了关注安全性、错误处理和性能优化。
566 2
|
存储 Kubernetes 安全
Nacos常见问题之服务端grpc请求服务端端口一直不可用
Nacos是一款易于使用的动态服务发现、配置管理和服务管理平台,针对不同版本可能出现的兼容性和功能问题,本汇总贴心整理了用户在使用Nacos时可能遇到的版本相关问题及答案,以便用户能够更顺畅地进行服务治理和配置管理。
774 0
|
消息中间件 物联网 Java
[笔记]阿里云物联网之业务服务端(java、php)接入阿里云平台(一)
[笔记]阿里云物联网之业务服务端(java、php)接入阿里云平台
527 1
|
测试技术
Netty4 websocket 开启服务端并设置IP和端口号
Netty4 websocket 开启服务端并设置IP和端口号
558 0