基于PHP的TCP服务方法及服务器与流程

文档序号:17726699发布日期:2019-05-22 02:33阅读:246来源:国知局
基于PHP的TCP服务方法及服务器与流程

本申请涉及通信技术领域,具体而言,涉及一种基于php的tcp服务方法及服务器。



背景技术:

现有技术中的php服务应用一般都是通过php-fpm对外提供基于http协议的cgi服务;此外,由于php服务本身不是常驻内存的,一方面,每一次http通信,php服务端都要重新开启一次生命周期,服务效率大打折扣;另一方面,传统的cgi服务耦合性较高,一个接口服务发生问题,可能会导致其他很多接口服务受影响。

针对相关技术中存在的诸多问题,目前尚未提出有效的解决方案。



技术实现要素:

本申请的主要目的在于提供一种基于php的tcp服务方法及服务器,以解决背景技术中存在的至少一个技术问题。

为了实现上述目的,根据本申请的一个方面,提供了一种基于php的tcp服务方法。

根据本申请的基于php的tcp服务方法包括:

通过php服务应用程序启动socket服务,对服务端口进行监听;

通过所述服务端口接收客户端发送的数据包;其中,每个所述服务端口具有对应的通信协议;

根据与所述服务端口对应的通信协议对所述数据包进行处理,得到相应数据结构可编程的数据;

调取与所述通信协议对应的函数对所述数据进行处理得到对应的执行结果。

进一步的,如前述的基于php的tcp服务方法,所述php服务应用程序包括:wokerman以及swooleserver。

进一步的,如前述的基于php的tcp服务方法,所述根据与所述服务端口对应的通信协议对所述数据包进行处理,得到相应数据结构可编程的数据,包括:

根据接收所述数据包的服务端口,确定与所述服务端口对应的通信协议;

使用与所述服务端口对应的通信协议对所述数据包进行解析,得到对应的数据包明文;

通过所述通信协议定义的序列化方法对所述数据包明文进行反序列化,得到数据结构可编程的数据。

进一步的,如前述的基于php的tcp服务方法,调取与所述通信协议对应的函数对所述数据进行处理得到对应的执行结果,包括:

通过php的反射机制或call_user_func或call_user_func_array调取与所述通信协议对应的函数;

根据所述函数对所述数据进行处理得到对应的执行结果。

进一步的,如前述的基于php的tcp服务方法,在得到对应的执行结果之后,还包括:

使用所述通信协议对所述执行结果进行序列化和加密得到加密后结果;

将所述加密后结果通过所述服务端口进行发送。

为了实现上述目的,根据本申请的另一方面,提供了一种基于php的tcp服务的服务器。

根据本申请的基于php的tcp服务的服务器包括:

监听单元,用于通过php服务应用程序启动socket服务,对服务端口进行监听;

数据包接收单元,用于通过所述服务端口接收客户端发送的数据包;其中,每个所述服务端口具有对应的通信协议;

解析单元,用于根据与所述服务端口对应的通信协议对所述数据包进行处理,得到相应数据结构可编程的数据;

数据处理单元,用于调取与所述通信协议对应的函数对所述数据进行处理得到对应的执行结果。

进一步的,如前述的基于php的tcp服务的服务器,所述php服务应用程序包括:wokerman以及swooleserver。

进一步的,如前述的基于php的tcp服务的服务器,所述解析单元,包括:

通信协议确定模块,用于根据接收所述数据包的服务端口,确定与所述服务端口对应的通信协议;

数据包明文获取模块,用于使用与所述服务端口对应的通信协议对所述数据包进行解析,得到对应的数据包明文;

反序列化模块,用于通过所述通信协议定义的序列化方法对所述数据包明文进行反序列化,得到数据结构可编程的数据。

进一步的,如前述的基于php的tcp服务的服务器,所述数据处理单元包括:

函数调取模块,用于通过php的反射机制或call_user_func或call_user_func_array调取与所述通信协议对应的函数;

执行模块,用于根据所述函数对所述数据进行处理得到对应的执行结果。

进一步的,如前述的基于php的tcp服务的服务器,还包括:

序列化及加密单元,用于使用所述通信协议对所述执行结果进行序列化和加密得到加密后结果;

数据发送单元,用于将所述加密后结果通过所述服务端口进行发送。

在本申请实施例中,采用一种基于php的tcp服务方法及服务器的方式,其中方法通过包括:通过php服务应用程序启动socket服务,对服务端口进行监听;通过所述服务端口接收客户端发送的数据包;其中,每个所述服务端口具有对应的通信协议;根据与所述服务端口对应的通信协议对所述数据包进行处理,得到相应数据结构可编程的数据;调取与所述通信协议对应的函数对所述数据进行处理得到对应的执行结果。达到了能够建立起一种基于php的tcp服务方法的目的,从而实现了通过本发明开发得到的tcp服务能够轻松应对高并发的服务场景,同时确保服务的高可用性;任何语言的客户端,只需要实现相应的通信协议,都可以调用该集群服务;同时,通过本申请实现的集群服务只提供局域网内的网络服务,所以性能和安全性都可以得到保障。

附图说明

构成本申请的一部分的附图用来提供对本申请的进一步理解,使得本申请的其它特征、目的和优点变得更明显。本申请的示意性实施例附图及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:

图1是根据本申请一种实施例的基于php的tcp服务方法的方法流程示意图;以及

图2是根据本申请一种实施例的基于php的tcp服务的服务器的功能模块结构示意图。

具体实施方式

为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。

需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

在本申请中,术语“上”、“下”、“左”、“右”、“前”、“后”、“顶”、“底”、“内”、“外”、“中”、“竖直”、“水平”、“横向”、“纵向”等指示的方位或位置关系为基于附图所示的方位或位置关系。这些术语主要是为了更好地描述本申请及其实施例,并非用于限定所指示的装置、元件或组成部分必须具有特定方位,或以特定方位进行构造和操作。

并且,上述部分术语除了可以用于表示方位或位置关系以外,还可能用于表示其他含义,例如术语“上”在某些情况下也可能用于表示某种依附关系或连接关系。对于本领域普通技术人员而言,可以根据具体情况理解这些术语在本申请中的具体含义。

此外,术语“安装”、“设置”、“设有”、“连接”、“相连”、“套接”应做广义理解。例如,可以是固定连接,可拆卸连接,或整体式构造;可以是机械连接,或电连接;可以是直接相连,或者是通过中间媒介间接相连,又或者是两个装置、元件或组成部分之间内部的连通。对于本领域普通技术人员而言,可以根据具体情况理解上述术语在本申请中的具体含义。

需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。

根据本申请的一个实施例,提供了一种基于php的tcp服务方法。如图1所示,该方法包括如下的步骤s1至步骤s4:

s1.通过php服务应用程序启动socket服务,对服务端口进行监听;

具体的,通过所述php服务应用程序启动socket服务之后,可以同时对多个所述服务端口进行监听,并且当监听到所述服务端口发送数据时,则进行接收;

s2.通过所述服务端口接收客户端发送的数据包;其中,每个所述服务端口具有对应的通信协议;

由于每个所述服务端口提供的服务都不一样,包括但不限于:鉴权、解析、解密、验证;因此每个所述服务端口接收的数据报的类型也各不相同;

s3.根据与所述服务端口对应的通信协议对所述数据包进行处理,得到相应数据结构可编程的数据;

由于每个所述服务端口提供的服务都不一样,包括但不限于:鉴权、解析、解密、验证;因此每个所述服务端口对应的通信协议也都不同;

且在对所述数据包进行解析的时候,需要确定客户端发送该数据包所请求的服务,然后在调用对应的通信协议对其进行解析,以得到所述相应数据结构的数据;

s4.调取与所述通信协议对应的函数对所述数据进行处理得到对应的执行结果。

通过本实施例的方法达到了能够建立起一种基于php的tcp服务方法的目的,从而实现了通过本发明开发得到的tcp服务能够轻松应对高并发的服务场景,同时确保服务的高可用性;任何语言的客户端,只需要实现相应的通信协议,都可以调用该集群服务;同时,通过本申请实现的集群服务只提供局域网内的网络服务,所以性能和安全性都可以得到保障。

在一些实施例中,如前述的基于php的tcp服务方法,所述php服务应用程序包括:wokerman以及swooleserver。

在一些实施例中,如前述的基于php的tcp服务方法,根据与所述服务端口对应的通信协议对所述数据包进行解析,得到相应数据包明文,包括:

根据接收所述数据包的服务端口,确定与所述服务端口对应的通信协议

使用与所述服务端口对应的通信协议对所述数据包进行解析,得到对应的数据包明文;

具体的,所述通信协议可以包括但不限于下述几种,并且可以根据具体需要实现的功能(例如:鉴权、解析、解密和验证)设定相应的通信协议:

e.提出一种tcp通信协议,协议通过定义数据包长度或者协议分隔符的形式来封装一个协议数据包,包体部分可以使用json格式进行序列化;

f.提供一种数据包安全通信方式,使用crc对数据体生成签名字段,使用aes对整个数据包进行加密;

g.提供一种数据压缩方式,使用gzip进行数据压缩,降低服务调用过程中的带宽流量;

h.提供一种客户端交互方式,通过e中提供的协议规范获取数据包,然后进行gzip解压缩,使用f中对应的aes进行解密,并对crc字段进行校验,最后使用json格式进行反序列化,得到最终的数据;

i.提供一种权限校验机制,对于某些需要权限验证的服务进行身份校验,只允许校验通过的客户端发起指定调用;

所述数据包明文主要由两部分组成:一个是包含“命名空间+类名+方法名”的方法名称,另一个是参数列表;

通过所述相应的通信协议定义的序列化方法对所述数据包明文进行反序列化,得到所述数据结构可编程的数据。

举例的:这里用json序列化方法举例,得到的数据包明文为{"call":"system\user::getbyid","params":{"id":1}},反序列化后得到一个php数组$request,$request['call']的值为"system\user::getbyid",$request['params']的值为array('id'=>1)。

且本文中的序列化:就是,将内存的变量数据,“保存”到文件中的持久数据的过程;

简化就是:将内存变为文件;

其中一种做法可以是:

$s=serialize($变量);//该函数将变量数据进行序列化转换为字符串;

file_put_contents(‘./目标文本文件’,$s);//将$s保存到指定文件;

所述反序列化:就是,将序列化过存储到文件中的数据,恢复到程序代码的变量表示形式的过程;

简化就是:将文件变为内存;

其中一种做法可以是:

$s=file_get_contents(‘./目标文本文件’);//取得文本文件的内容(之前序列化过的字符串);

$变量=unserialize($s);//将该文本内容,反序列化到指定的变量。

在一些实施例中,如前述的基于php的tcp服务方法,调取与所述通信协议对应的函数对所述数据进行处理得到对应的执行结果,包括:

通过php的反射机制或call_user_func或call_user_func_array调取与所述通信协议对应的函数;

其中,所述php的反射机制即:允许在php运行环境中,访问和使用类、方法、属性、参数和注释等,经常用于高扩展的php框架,自动加载插件,自动生成文档,甚至可以用来扩展php语言。由于它是php內建的oop扩展,为语言本身自带的特性,所以不需要额外添加扩展或者配置就可以使用;

call_user_func函数是php引用匿名函数的一种方式,php可以通过call_user_func函数来调用匿名函数,这也能做到局部变量不被全局污染,call_user_func调用的回调函数不仅仅是我们自定义的函数,还可以是php处理字符串的系统函数,如rtrim、explode函数;call_user_func_array函数,这个函数的调用和作用和call_user_func函数基本一样,所不同的是,call_user_func_array函数只能传递两个参数,第一个是回调函数名,或者匿名函数,或者类方法,第二个参数则是数组,call_user_func_array是利用回调函数处理数组,而call_user_func则是利用回调函数处理字符串;

根据所述函数对所述数据进行处理得到对应的执行结果;

具体的,举例来说:

在上一实施例的反序列化后得到一个php数组$request,$request['call']的值为"system\user::getbyid",$request['params']的值为array('id'=>1)的基础上,得到可调用的参数定义以后,就可以用php的反射机制,或者call_user_func/call_user_func_array等方法来执行对应的函数调用了。比如用call_user_func_array调用指定函数方法$ret=call_user_func_array($request['call'],$request['params']),返回执行结果$ret。

在一些实施例中,如前述的基于php的tcp服务方法,在得到对应的执行结果之后,还包括:

使用所述通信协议对所述执行结果进行序列化和加密得到加密后结果;

具体的,可以根据但不限于前述实施例中的一种或多种通信协议对所述执行结果进行序列化或加密;

将所述加密后结果通过所述服务端口进行发送。

具体的,应用上述实施例中的方法实现服务端与客户端的一种通信方法可以是:

在整个基础通信的逻辑由wokerman或者swooleserver等php服务应用程序来完成。至于协议的定义、封装和解析工作,都由对应的服务端和客户端来完成。整个通信流程为:客户端发起请求->服务端接收数据->服务端鉴权、解析、解密、验证->服务端执行指定的远程方法调用->服务端将执行结果进行序列化、加密等操作,返回给客户端->客户端接收服务端返回的数据->客户端对返回数据进行解析、解密和验证,得到rpc的调用结果->客户端使用rpc的调用结果执行后续逻辑。

需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

根据本发明实施例,还提供了一种用于实施上述基于php的tcp服务方法的基于php的tcp服务的服务器,如图2所示,该装置包括:

监听单元1,用于通过php服务应用程序启动socket服务,对服务端口进行监听;

数据包接收单元2,用于通过所述服务端口接收客户端发送的数据包;其中,每个所述服务端口具有对应的通信协议;

解析单元3,用于根据与所述服务端口对应的通信协议对所述数据包进行处理,得到相应数据结构可编程的数据;

数据处理单元4,用于调取与所述通信协议对应的函数对所述数据进行处理得到对应的执行结果。

具体的,本发明实施例的装置中各模块实现其功能的具体过程可参见方法实施例中的相关描述,此处不再赘述。

在一些实施例中,如前述的基于php的tcp服务的服务器,所述php服务应用程序包括:wokerman以及swooleserver。

具体的,本发明实施例的装置中各模块实现其功能的具体过程可参见方法实施例中的相关描述,此处不再赘述。

在一些实施例中,如前述的基于php的tcp服务的服务器,所述解析单元,包括:

通信协议确定模块,用于根据接收所述数据包的服务端口,确定与所述服务端口对应的通信协议;

数据包明文获取模块,用于使用与所述服务端口对应的通信协议对所述数据包进行解析,得到对应的数据包明文;

反序列化模块,用于通过所述通信协议定义的序列化方法对所述数据包明文进行反序列化,得到数据结构可编程的数据。

具体的,本发明实施例的装置中各模块实现其功能的具体过程可参见方法实施例中的相关描述,此处不再赘述。

在一些实施例中,如前述的基于php的tcp服务的服务器,所述数据处理单元包括:

函数调取模块,用于通过php的反射机制或call_user_func或call_user_func_array调取与所述通信协议对应的函数;

执行模块,用于根据所述函数对所述数据进行处理得到对应的执行结果。

具体的,本发明实施例的装置中各模块实现其功能的具体过程可参见方法实施例中的相关描述,此处不再赘述。

在一些实施例中,如前述的基于php的tcp服务的服务器,还包括:

序列化及加密单元,用于使用所述通信协议对所述执行结果进行序列化和加密得到加密后结果;

数据发送单元,用于将所述加密后结果通过所述服务端口进行发送。

具体的,本发明实施例的装置中各模块实现其功能的具体过程可参见方法实施例中的相关描述,此处不再赘述。

显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。

以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1