<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>https://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>https://jackxiang.com/post//</link>
<title><![CDATA[PHP不如C++ 吗？被swoole坑哭的PHP程序员。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Php/Js/Shell/Go]]></category>
<pubDate>Thu, 17 Sep 2015 06:26:56 +0000</pubDate> 
<guid>https://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	昨天和一个前同事聊天，各种吐槽PHP，吐槽Swoole，他认为PHP到处是坑，PHP局限很大。PHP+Swoole不适合做高并发服务器，C+Swoole才是最好的方案。C++有各种数据结构，C++可以开线程，C++可以共享对象。看来有必要好好得说明一下了。<br/><br/>PHP不如C++ 吗？<br/><br/>PHP比C/C++或Java少了什么？多线程，多线程，多线程……<br/><br/>是的。PHP比C/C++、Java少了多了多线程。PHP只有多进程的方案，所以PHP里的全局变量和对象不是共享的、数据结构也不能跨进程操作、Socket文件描述符不能共享等等。所以PHP有局限？<br/><br/>多线程看似比多进程要强大很多，实际上我可以负责任的告诉你，多线程带来的坑更多。<br/><br/>数据同步问题会让你崩溃的。要么就牺牲性能到处加锁，要么就用地狱难度的无锁并发编程，据我所知目前国内能掌握此项技能的人凤毛麟角。<br/><br/>不要以为加锁就万事大吉了，你会在死锁问题上栽个大跟头。当你的程序逻辑复杂后，锁越来越难控制了，一旦死锁你的程序基本上就完了。<br/><br/>某个线程挂了那所有线程都会退出<br/><br/>反而在看多进程，其实就简单的多了。<br/><br/>配合进程间通信，基本上你可以实现任意的数据共享。比如利用一个进程专门存数据结构和对象，其他进程的数据操作全部投递到此进程来<br/><br/>多进程不需要锁<br/><br/>多进程可以使用共享内存的数据结构实现一些多线程的功能。如Swoole提供的Table、Atomic可以实现数据共享，但成本很低。未来还会加入共享内存队列<br/><br/>所谓PHP限制了Swoole，这完全是无稽之谈。合理利用Swoole提供的Table、Atomic、SendMessage/PipeMessage、Task完全可以实现异步非阻塞的代码逻辑。<br/><br/>C++写出来的程序性能更好？<br/><br/>这完全是盲目的迷信，密集计算的程序C++确实是有优势的。而并发服务器核心是IO，并非大规模密集运算。C++从语言层面来看并没有什么优势。另外C++中的大部分数据结构在PHP中都有对应的实现，实在不行自己写个专门的扩展也能解决之。<br/><br/>高并发的服务器单机能维持10W连接、每秒可处理3-5W笔消息收发。这种性能水准已经可以应用在BAT的核心系统上了。<br/><br/>开发效率快的意义是什么？<br/><br/>这位同事还说PHP开发Server虽然比C++快了，但是追求性能的极致还是要用C++。我要告诉你效率高了究竟意义何在。开发一套好程序不是一 件容易的事情，需要程序员投入大量时间和精力。开发效率提升的意义并不是简单的我可以更少时间完工，而是剩下的时间你可以增加单元测试、修复BUG、提升 用户体验、完善细节、提供配套工具、优化性能、增加关键日志、增加监控报警、增加容灾方案。<br/><br/>被swoole坑哭的PHP程序员：<br/>首先说一下对swoole的理解：披着PHP外衣的C程序。很多PHPer朋友看到swoole提供的强大功能、外界对其的崇拜便跃跃欲试的安装、调 试其demo、编写新功能，然后兴奋的奔走相告。没过几天当你按照自己的理解继续用swoole时，发现代码并没有按照自己的预期运行，然后开始破口大 骂，什么破东西呀，代码跟demo基本一样，为啥运行不通呢？什么狗屁work、task、共享内存、ipcs、异步，各种问题涌现，然后迅速去查官方文 档，发现文档中竟然对这些并没有提及，只是简单的介绍怎么使用，此时几乎对swoole丧失希望。<br/><br/>被swoole坑哭的PHP程序员<br/><br/>遇到的几点问题：<br/><br/>1：关于phper常用的全局变量（global）为什么在onRequest函数中不能使用。<br/><br/>因为swoole是多线程编程，global是不能在多个进程间共享的。例<br/><br/>global $i = 0; <br/> <br/>function onRequest() &#123; <br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;echo $i++; <br/> <br/>&#125; <br/>如果在swoole中写一个上面的程序，并不会每次访问输出一个递增的数字。如果要实现预期的效果，需要使用swoole_table的相关函数。<br/><br/>2：什么是异步、什么是回高<br/><br/>对于phper来说，对异步、回调的理解估计就是ajax。当看到swoole里面对异步、回调的解释，貌似很简单的样子，就这样在没有任何多线程编辑经验的时候贸然用了swoole，结果被坑的偷偷撸代码好几个通宵来填自己的坑。<br/><br/>3：为什么onReceive收到的数据这么大<br/><br/>客户端发送的多次请求，服务端是可以一次性接收的。并不是客户端发送一次，服务端接收一次<br/><br/>4：自制httpserve<br/><br/>写一个http服务端，然后通过浏览器访问这个自制的服务器，刷新一次浏览器，服务端为什么为接收到两次请求？这个问题估计困饶了好多初次用swoole写httpserver的朋友。因为浏览器会多发一个favicon.ico请求。<br/><br/>原因<br/><br/>出现这种情况的原因其实很简 单，大部分phper都只会php这一种语言，主要用途就是做web，写业务逻辑。很少去了解服务器程序的开发。有一次一个朋友用swoole写了一个简 单的服务端，一个客户端，跑过来问我为什么都启动了却都收不到数据，我简单看了下代码，所有连接确实都成功了，两端都设置了onReceive回调，代码 没问题，看到最后才发现他的服务端、客户端都设置了接到消息的回调函数，但是两端都没有向对方发消息，两端处于僵持状态。然后swoole官方对于这种常 识问题没有给出说明，只是说如何设置回调、如何发消息，如何这样，如何那样。对于有服务端开发经验的同学来说，肯定不会遇到这种问题，swoole文档也 不需要指明需要这样做，因为这是常识。但对于phper来说，指明这一点是非常重要的，因为如上面所说phper是没有这方面认知的，只有服务端开发经验 的程序员有才会有。<br/><br/>swoole的特色：网络通信 框架、异步、多线程。这些特性正是php所不完善的功能（虽然官方提供很多基础函数可以实现这些功能，然后缺少中文文档，很少有人用php来实现这部分功 能），普通的phper也不具备这些特性的基础认知，所以贸然使用swoole难免会遇到一些根本在swoole官方查不到的常识问题。<br/><br/>使用swoole必须要掌握的技能<br/><br/>多线程编程<br/><br/>进程间通信<br/><br/>网络协议TCP/UDP的认知<br/><br/>PHP的各项基本技能<br/><br/>个人学习swoole的经历<br/><br/>在很久之前我也是一个只会 php的程序员，后来一次偶然机会需要用httpsqs，用了一段时间后发现有一些个性的需求，于是就开始看源码。这真是不看不知道，一看吓一 跳，httpsqs只是一层简单的包装，内部是一个Tokyo Cabinet数据库，印象中封装的代码也就一百多行。主要思路就是用C语言的libevent做了一个http服务器，接收请求读写tokyo cabinet数据库，当时按照这种思路做出来的程序确实不少。后来我就突发奇想，既然C语言可以用libevent函数，那PHP肯定也可以用 libevent监听网络，接收请求后读写数据库做队列服务。后来经过查php官方文档，PHP确实提供一系统完整的函数来完成这些功能，甚至多线程的全 套函数都有提供，但中文文档太少，网上也很少搜索到成熟的代码。在逼不得已的情况下，补习了linux-C多线程开发的基本原理，进程间通信的常用方法， 也用来做了一些简单的demo。唯一的感觉就是写一个简单的功能，设计起来还真复杂。就在快要放弃的时候，swoole出现了。swoole所提供的功能 正是php所缺失的功能，简直是太棒了。swoole做为一种网络通信框架，只需要简单的几行设置，一个服务器就搭建起来了，以后就是不断的去完善业务代 码。之前在libevent交流群中得知swoole的设计在c&#92;c++中并不是最好的框架设计，但其亮点就是把基本功能用C封装好，业务功能留给世界上 最好的语言PHP来编写。自此便开始了swoole的填坑之旅。<br/><br/>总结<br/><br/>swoole并不是一个简单的PHP框架，正如swoole官方首页的第一句话“重新定义PHP”，千万不要用旧有php的思想来写swoole代码！swoole重新激活了PHP，php成就了swoole!
]]>
</description>
</item><item>
<link>https://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] PHP不如C++ 吗？被swoole坑哭的PHP程序员。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>