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

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

请不吝赐教,万分感谢。
8002 次点击
所在节点    PHP
34 条回复
huaiyinhou
2013-08-20 16:28:45 +08:00
一旦大量并发,问题就会出来。
建议还是队列或线程
picasso250
2013-08-20 16:32:00 +08:00
@pubby pcntl_signal(SIGCHLD, SIG_IGN); 已加。但有个疑问是:这个SIGCHLD信号默认就会被忽略的吧?

而且僵尸进程该如何解决?重启服务器吗……
jasontse
2013-08-20 16:33:41 +08:00
有COW的存在,创建进程的开销不大。跟CGI还是不一样的,exec和fork代价不同。
epoll如果业务逻辑没有长时间阻塞的操作可以试一下。
多进程有利于缓解php的内存泄漏
picasso250
2013-08-20 16:41:56 +08:00
@jasontse 多谢解释。但COW和进程是如何关联的?在C语言中,进程一定会复制一份自己内存。在php中,解释器能使zval在多个进程间共享吗?
pubby
2013-08-20 16:45:44 +08:00
@picasso250 反正我找遍了所有的避免僵尸方法,最后就这个管用 (PHP 5.3.10 / FreeBSD 8.2 amd64)
picasso250
2013-08-20 16:48:38 +08:00
@pubby ....
pubby
2013-08-20 16:56:23 +08:00
Ever
2013-08-20 17:10:59 +08:00
除了用信号, fork改成double fork也能处理掉僵尸
msg7086
2013-08-20 22:36:09 +08:00
如果要性能更好的话就要改用event/epoll来做。PHP可能局限性太大,可以考虑上py或者rb之类的,甚至是上functional programming
dogfeet
2013-08-20 23:05:44 +08:00
不会PHP.
如果要图快,使用一门带协程的语言不错。
如果可以,试下scala golang clojure等等嘛。
darasion
2013-08-20 23:34:22 +08:00
如果业务非常简单,貌似可以用shell:

以下是网上摘抄:
while true; do { echo -e 'HTTP/1.1 200 OK\r\n'; cat index.html; } | nc -l 8080; done
picasso250
2013-08-21 14:51:18 +08:00
@pubby 确实出现了很多僵尸进程。
bixuehujin
2013-08-21 15:15:05 +08:00
可以考虑单线程异步解决方案,PHP下有个reactphp,类似nodejs。
nofeeling
2013-09-11 22:57:22 +08:00
可以使用swoole框架,用C扩展实现的高性能高并发TCP Server。做一个健壮完善的Socket Server不是那么容易的,stream_socket_server和sockets扩展,或者是libevent, reactphp这些都不是完整的Server方案。
http://www4swoole.sinaapp.com/

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

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

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

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

© 2021 V2EX