首页 > 后端开发 > 正文

想问下php的socket的工作流程是什么?

2025-02-10 17:07:40 | 我爱编程网

今天我爱编程网小编整理了想问下php的socket的工作流程是什么?相关内容,希望能帮助到大家,一起来看下吧。

本文目录一览:

想问下php的socket的工作流程是什么?

想问下php的socket的工作流程是什么?

PHP利用Berkley的socket库来建立连接。socket实质上是一种数据结构,用它来开始客户端与服务器之间的会话。服务器端一直监听等待新的会话请求,一旦客户端连接服务器,它会打开服务器正在监听的端口,双方开始数据交换。创建一个Socket需要三个参数:协议、socket类型和公共协议类型。创建Socket时有三种可供选择的协议:AF_INET、AF_INET6、AF_UNIX。AF_INET协议使用TCP或UDP来传输,适用于IPv4的地址;AF_INET6适用于IPv6;AF_UNIX是本地协议,用于Unix和Linux系统。

Socket类型有四种:SOCK_STREAM、SOCK_DGRAM、SOCK_SEQPACKET、SOCK_RAW。SOCK_STREAM是一种基于字节流的连接,使用TCP进行传输,适用于大部分情况;SOCK_DGRAM是无连接的、固定长度的传输调用,使用UDP,适用于数据包大小固定的情况;SOCK_SEQPACKET是双线路的、可靠的连接,发送固定长度的数据包,必须完整接收才能读取;SOCK_RAW提供单一的网络访问,使用ICMP协议,适用于像ping和traceroute这样的工具;SOCK_RDM很少使用,大部分操作系统不支持,用于数据链路层,不保证数据包顺序。

公共协议包括ICMP、UDP、TCP。ICMP用于网关和主机检查网络状况和报告错误信息;UDP是一种无连接、不可靠的传输协议;TCP是最常用的可靠公共协议,保证数据包能够到达接收者,传输过程中发生错误则重新发送。

在PHP中使用socket_create()函数创建Socket,需要三个参数:协议、socket类型、公共协议。socket_create()函数成功返回一个包含Socket的资源类型,失败返回false。函数定义如下:Resource socket_create(int protocol, int socketType, int commonProtocol);

产生Socket后,PHP提供了几个操作Socket的函数,包括绑定Socket到一个IP、监听Socket通信、接受Socket等。以下是一个例子:$commonProtocol = getprotobyname(“tcp”); $socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol); socket_bind($socket, ‘localhost’, 1337); socket_listen($socket); // 更多Socket功能待续。在例子的第一行,使用公共协议名字获取一个协议类型,这里使用TCP协议;若使用UDP或ICMP协议,则将getprotobyname()函数的参数改为“udp”或“icmp”。另一种方法是直接在socket_create()函数中指定SOL_TCP或SOL_UDP。

第二行是创建一个Socket并返回一个Socket资源实例。有了一个Socket资源实例后,需要将Socket绑定到一个IP地址和某个端口上。

想问下php的socket的工作流程是什么?

php可不可以socket通信长连接,不断开,然后实现多次通讯?

理论上是可以的,使用PHP提供的socket相关API,主要问题是脚本执行时间。

PHP运行模式分为非 命令行 模式及命令行模式。
非命令行模式一般是用于B/S交互,max_execution_time默认为非零,也就是限制脚本执行时间。即使你设置max_execution_time为0也面临用户浏览器请求的超时问题。
命令行模式下set_limit_time默认为0,做为本地脚本执行,所以没有上述的问题。

PHP SOCKET相关文档:

利用PHP如何实现Socket服务器

我爱编程网(https://www.52biancheng.com)小编还为大家带来利用PHP如何实现Socket服务器的相关内容。

Socket服务器的工作方式是这样的,不间断地运行以等待客户端的连接。一旦客户端连接上了,服务器就会将它添加到客户名单中,然后开始等待来自客户端的消息。

下面是一个完整的源代码示例:

//Settimelimittoindefiniteexecution
set_time_limit(0);
//Settheipandportwewilllistenon
$address='localhost';
$port=10000;
$max_clients=10;
//Arraythatwillholdclientinformation
$client=Array();
//CreateaTCPStreamsocket
$sock=socket_create(AF_INET,SOCK_STREAM,0);
//Bindthesockettoanaddress/port
socket_bind($sock,$address,$port)ordie('Couldnotbindtoaddress');
//Startlisteningforconnections
socket_listen($sock);
echo"Waitingforconnections...\r\n";

接下来,我们进入一个无限循环,这里我们设置了一个 $read 数组,包含所有客户端的套接字和我们主服务器的套接字。这个变量稍后会用于socket_select语句:告诉PHP监听来自这些客户端的每一条消息。

socket_select()的最后一个参数告诉我们的服务器在返回值之前最多等待5秒钟。如果它的返回值小于1,表示没有收到任何数据,那么只需要返回循环顶部,继续等待。

然后我们检查是否有新的客户端连接,如果 $sock 在 $read 数组中,则表示有新的连接,我们将这个新的连接添加到客户端数组中。

接下来,代码会循环通过每个客户端,检查是否收到来自于它们的消息。如果是,获取输入的内容,根据输入来检查这是否是一个断开消息。如果是,从数组中删除它们;反之,那它就是一个正常的消息,服务器再次通过所有客户端,并一个一个写信息给他们,跳过发送者。

最后,关闭主服务器套接字。

乍一看,这似乎是一个大工程,但我们可以将其分解为几个较小的部分。第一部分是创建服务器,这是在代码的2至20行实现的。这部分代码设置了变量、地址、端口、最大客户端和客户端数组。接下来创建socket并将其绑定到我们指定的地址和端口上。

第二部分是设置 $read 数组,包含所有客户端的套接字和主服务器的套接字,这个变量稍后会用于socket_select语句。socket_select()的最后一个参数告诉我们的服务器在返回值之前最多等待5秒钟。如果它的返回值小于1,表示没有收到任何数据,那么只需要返回循环顶部,继续等待。

第三部分是增加新的客户端到数组中。这部分代码位于33至44行,将新的客户端放置在列表的末尾,检查以确保客户端的数量没有超过我们想要服务器处理的数量。

接下来是处理客户端消息的部分,这是服务器的主要部分。这部分代码从46行开始,当客户端将消息发送到服务器时,就需要这块代码挺身而出来处理。消息可以是各种各样的,断开消息、实际断开——只要是服务器需要处理的消息。

最后,我们可以尝试创建自己的聊天服务器。通过上述代码,你可以根据需求进行修改和扩展。 我爱编程网

以上就是想问下php的socket的工作流程是什么?全部内容,更多相关信息,敬请关注我爱编程网。更多相关文章关注我爱编程网:www.52biancheng.com

免责声明:文章内容来自网络,如有侵权请及时联系删除。
与“想问下php的socket的工作流程是什么?”相关推荐
我想了解下,学会python一般能找到拿工资多少的工作
我想了解下,学会python一般能找到拿工资多少的工作

我想了解下,学会python一般能找到拿工资多少的工作1、Web开发:python有很多优秀的web开发框架,比如Flask、Django、Bootstar等,可以帮助你快速搭建一个网站。需要一个新功能时,用python只需要几行代码就可以了,受到很多初创公司喜欢。现在像知乎、豆瓣、小米这样大厂,最早网站都是python搭建的,像国外YouTube、Quora、Reddit、Inst

2024-01-14 09:01:15
请问下js下的作用域和php的作用域有什么不同
请问下js下的作用域和php的作用域有什么不同

请问下js下的作用域和php的作用域有什么不同是的,js和php都属于没有块级作用域的脚步语言,iffor中声明的变量外部可见;如果想让外部无法访问,只能在函数里定义变量,通过闭包的方式访问。比如   function f(){ var x = "in"; function get(){ console.log(x); } return { getX:get }; }

2025-01-05 10:46:35
什么是PHP中的流streams
什么是PHP中的流streams

php使用scandir($dir)读取$dir目录下文件,前两个是不是都是.和..啊?在线等待!!这个自己在具体操作之前判断一下就行了,如果是.或者..就跳过不就ok了scandir列出指定路径中的文件和目录(PHP5)arrayscandir(stringdirectory[,intsorting_order[,resourcecontext]])返回一个array,包含有

2024-11-04 05:53:43
什么是java虚拟机,简述其工作机制
什么是java虚拟机,简述其工作机制

什么是java虚拟机,简述其工作机制Java虚拟机处于机器和编译程序之间,在任何平台上都提供给编译程序一个共同的接口。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。Java虚拟机的主要任务是装载class文件并且执行其中的字节码。Java虚拟机包含一个类装载器,它可以从程序

2024-06-28 13:48:00
人工智能python课程是什么
人工智能python课程是什么

人工智能python课程是什么人工智能Python课程是一门介绍如何使用Python编程语言来实现和应用人工智能技术的课程。这门课程将深入探讨人工智能的核心概念、算法和应用,并通过Python编程语言来实践这些技术。在人工智能Python课程中,你将学习到各种人工智能相关的知识和技能,包括机器学习、深度学习、自然语言处理等领域。你将了解不同的算法和模型,如决策树、支持向量机、神经网络等

2024-03-01 08:23:22
简述Java程序从编写到运行的基本步骤,并说明Java的基本工作原理 简述Java应用程序的开发流程。
简述Java程序从编写到运行的基本步骤,并说明Java的基本工作原理 简述Java应用程序的开发流程。

简述Java程序从编写到运行的基本步骤,并说明Java的基本工作原理Java编译原理:Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。一.Java源文件的编译、下载、解释和执行Java应用程序的开发周期包括编译、下载、解释和执行几个部分。Java编译

2024-06-30 06:04:31
visual studio的什么工作负载可以运行java?
visual studio的什么工作负载可以运行java?

vscommunity2019能编译Java教程:在自己已有的项目中右击添加setpeoject,右击ApplicationFolder->Add->项目输出,在ApplicationFolder上右键添加项目输出,注意是你项目的主输出(主程序部分),确定后生成系列文件,在主输出上右键第一个创建快捷方式,将生成的快捷方式可以改成自己希望的程序名称,就是你打包的程序名.exe文

2024-03-20 05:05:29
java程序的运行流程 java开发流程
java程序的运行流程 java开发流程

简述Java应用程序的开发流程Java应用程序的运行经过编写、编译、运行三个步骤。第1步,编写程序。使用记事本或其他软件编写程序的源代码,将源代码保存为文件filename.java文件。第2步,编译程序。在MS-DOS命令窗口,将当前目录转换到Java源程序所在的保存目录;输入“javacfilename.java”形式的命令进行程序编译。第3步,执行程序。在同样的命令窗口中

2024-05-10 12:05:03