工作需要,做一TCP服务器,主进程监听,一旦有连接就分一个子进程去处理。优缺点是什么?

2013-08-20 13:16:10 +08:00
 picasso250
http://gist.github.com/picasso250/6277302

请不吝赐教,万分感谢。
7947 次点击
所在节点    PHP
34 条回复
v8ex
2013-08-20 13:18:57 +08:00
随着连接的增加会增加N个进程(消耗系统资源),建议用队列和线程;
picasso250
2013-08-20 13:20:06 +08:00
刚刚看了一下,貌似php中专门有一个函数建立服务器的,是stream_socket_server
picasso250
2013-08-20 13:24:11 +08:00
@v8ex 1. 但我的子进程会自杀。也会消耗系统资源吗?
2. 队列的话,如何保证实时处理?(用php-resque可以做吗?)
3. 线程编写起来有些麻烦,且不是php的强项。有没有成熟的tcp服务器,可以调用php脚本?如果没有,那么用php编写线程也是无奈之举。
jasontse
2013-08-20 13:24:23 +08:00
用pthreads吧,感觉fork写起来会很麻烦
timonwong
2013-08-20 13:27:29 +08:00
优点是模型简单,可以处理长业务,健壮性也还好。最大的缺点就是消耗很多的系统资源(并发数高的话)。

这个看你需要多少并发,业务内容是什么。
ipconfiger
2013-08-20 13:28:53 +08:00
@picasso250 优点是不会阻塞主进程,缺点是在高并发的时候很快就会将你系统的最大进程数耗尽,或者是内存。很多进程操作系统在切换的时候也响应不过来,然后就会变得很慢。
picasso250
2013-08-20 13:29:14 +08:00
@jasontse 我本来是觉得用pthreads写起来会麻烦一些。不过线程还有一个问题就是一旦死掉,会连累其他线程。
cdfmr
2013-08-20 13:29:38 +08:00
并发数不高的话,这个方案没什么问题。
picasso250
2013-08-20 13:31:20 +08:00
@timonwong 谢谢。并发不大,一天的PV才不到10万,能有多少并发…… 业务也并非长业务。
daoluan
2013-08-20 13:32:58 +08:00
优点,简单;缺点,进程创建开销大,而且数量非常有限。
Shieffan
2013-08-20 13:39:23 +08:00
简单粗暴但稳定。效率(并发性能)一般,进程所耗资源相对大,系统内可fork的进程数有限,而且进程频繁切换耗费比较大,特别是高IO的进程,效率会大大降低。

一句话,如果并发要求没那么高而且是高CPU的任务,用多进程比较合理。
如果是高IO,高并发的,建议用其它并发模型。
v8ex
2013-08-20 13:54:52 +08:00
@picasso250 每次都要fork 肯定会消耗资源的;
线程可以绑定CPU;
PHP不懂,还以为你用C/C++呢;
jseanj
2013-08-20 14:04:21 +08:00
当并发量很大时,如果请求是cpu型操作,那么你的负载就会很高,每个子进程都会占用cpu,latency会变高。如果请求是io型操作,那么你的cpu就会闲置,导致资源浪费。当然,如果并发量不大的话是没什么问题的。如果io操作多一些的话,可以考虑nginx。
xunyu
2013-08-20 14:35:40 +08:00
我也有过类似的需求,后来是通过tornado分配新线程处理的
Ever
2013-08-20 14:44:52 +08:00
这样写肯定会出现很多僵尸进程的
xiaoye5200
2013-08-20 14:45:57 +08:00
epoll?
bjzhush
2013-08-20 15:07:22 +08:00
我也是PHPer,感觉PHP不是很适合做这个场景的工作
比如你如何运行这个脚本 ? 以后如果需要相互通信又如何做 ?
lj0014
2013-08-20 15:35:11 +08:00
优点:逻辑简单,每个连接独立进程即使挂了也不影响其它进程和父进程
缺点:每个连接一个进程开销大,不适合连接数高的应用
harrymoo
2013-08-20 15:41:35 +08:00
可以搞个进程池,不用每次都创建销毁进程,快一点。 这个是以前做C的经验,PHP不懂。
pubby
2013-08-20 16:14:12 +08:00
@Ever
@picasso250


Ever : "这样写肯定会出现很多僵尸进程的"

赞同,而且会非常严重,内存耗尽或者达到每用户进程数上限为止

楼主得记得加上:
pcntl_signal(SIGCHLD, SIG_IGN);


结构简单,稳定可靠。
这点pv确实没啥性能讲究,用着先吧。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/79632

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX