本文主要记录学习swoole的过程,填过的坑以及swoole到底有多强大!首先说一下我对swoole的理解:一个披着PHP外衣的C程序。很多PHPer朋友看到swoole提供的强大功能和外界的刮目相看,就迫不及待地安装,调试它的demo,写新功能,然后兴冲冲的跑来跑去。过了几天,当你按照自己的理解继续使用swoole时,发现代码并没有像你预期的那样运行起来,然后开始大喊,好破的东西,代码和demo基本一样,为什么它不起作用?什么废话work,task,sharedmemory,ipcs,asynchrony,各种问题层出不穷,然后赶紧查了下官方文档,发现文档里都没有提到这些,只是简单的介绍了如何使用。这个时候我对swoole几乎失去了希望。遇到的一些问题:1:关于为什么phper常用的全局变量(global)不能在onRequest函数中使用。因为swoole是多线程编程,global不能在多个进程间共享。例子global$i=0;functiononRequest(){echo$i++;}如果你用swoole写上面的程序,它不会每次访问都输出一个递增的数字。想要达到预期的效果,需要使用swoole_table的相关函数。2:什么是异步,什么是高回报?对于PHPer来说,对异步和回调的理解估计就是ajax了。当初看到swoole里面关于异步和回调的解释,觉得很简单,所以在没有多线程编辑经验的情况下就贸然使用了swoole。结果被骗了好几个晚上偷偷码字填坑。3:为什么onReceive收到的数据这么大?服务器可以同时接收客户端发送的多个请求。不是客户端发送一次,而是服务端接收一次。4:用自制的httpserve写一个http服务器,然后通过浏览器访问自制服务器,刷新浏览器一次。服务器为什么会收到两个请求?这个问题估计很多第一次用swoole写httpserver的小伙伴比较头疼。因为浏览器会再发送一个favicon.ico请求。造成这种情况的原因其实很简单。大多数phper只懂php这门语言,主要目的是做web和写业务逻辑。对服务器程序的开发了解甚少。曾经有朋友用swoole写了一个简单的server和client,来问我为什么启动后收不到数据。简单看了下代码,发现所有连接都成功了。onReceive回调设置好了,代码没问题。最后发现服务端和客户端都设置了接收消息的回调函数,但是两端都没有给对方发送消息,两端陷入僵持状态。然后swoole官方对于这个常识性的问题并没有给出解释,只是说了怎么设置回调,怎么发送消息,这个怎么做,那个怎么做。对于有服务端开发经验的同学来说,肯定不会遇到这种问题,swoole文档也不需要说明需要这样做,因为这是常识。但是对于phper来说,明确这一点是非常重要的,因为上面说了phper没有这方面的知识,只有有服务端开发经验的程序员才会有。swoole的特点:网络通信框架,异步,多线程。这些功能是php不完整的功能(虽然官方提供了很多实现这些功能的基本功能,而且缺少中文文档,很少有人用php来实现这部分功能),普通的phper对这些基本没有认识features我知道,所以如果贸然使用swoole,难免会遇到一些官方swoole找不到的常识性问题。使用swoole必须掌握的技能多线程编程进程间通信网络协议TCP/UDPPHP各种基本技能的认识个人学习swoole的心得很久以前我也是一个只懂php的程序员,然后一次偶然的需要,用了一段时间的httpsqs,发现了一些个性化的需求,于是开始看源码。我真的不知道这个,但当我看到它时,我感到震惊。httpsqs只是一层简单的封装。里面是一个TokyoCabinet数据库,印象中打包的代码只有100多行。主要思路是用C语言libevent做一个http服务器,接收读写tokyocabinet数据库的请求。当时确实有很多按照这个思路制作的节目。后来突然想到,既然C语言可以使用libevent功能,那么PHP也必须使用libevent来监控网络,接收请求后作为队列服务读写数据库。后来查了php官方文档,PHP确实提供了一套完整的功能来完成这些功能,甚至还提供了全套的多线程功能,但是中文文档太少,成熟的代码很少在上面搜索到互联网。不得已研究了linux-C多线程开发的基本原理,进程间通信的常用方法,也用它做了一些简单的demo。唯一的感觉就是写个简单的功能,设计起来确实复杂。就在他准备放弃的时候,swoole出现了。swoole提供的功能正是php所缺少的功能,简直是奇葩。swoole作为一个网络通信框架,只需要简单的几行设置,搭建一个服务器,后续会不断完善业务代码。在libevent交流群了解到,swoole的设计并不是c\c++中最好的框架设计,但它的亮点在于基础功能用C封装,业务功能交给世界上最好的语言PHP来写.自此开始了swoole的填坑之旅。综上所述,swoole并不是一个简单的PHP框架。就像swoole官网第一句话“重新定义PHP”一样,不要用老php的思路写swoole代码!Swoole重新激活PHP,php生成swoole!
