Home  >  Q&A  >  body text

socket - 使用php多线程 , 多进程??

I. php 多进程的使用情况怎样?? (绝大多数php程序都用上了 | 几乎用不上)

II. php 多线程的使用情况怎样?? (绝大多数php程序都用上了 | 几乎用不上)

III. php 多进程 , php多线程 相比较 java 怎样??(简直糟透了 | 不相上下)

网络上几乎都写到 php 不适合多线程(是否也不适合多进程??),是否这样就不需要了解多线程,多进程之类的php相关特性了??

然后最近由于个人喜好,想自己动手做一个 类似qq的网页版聊天工具,现在 基本上了解了 socket 通信 , 但 了解了下 workerman 这样的开源 通信框架,他的特性介绍里面包括以下几个:

I. php多进程 可以发挥多核cpu优势,提高性能,并支持高并发??

II . php单个进程可以支持几千甚至几万的并发连接,多进程则可以支持数十万甚至上百万的并发连接。 这句话该怎么理解?? 由于它采用的是 socket 的方式进行通信,那么端口数实际上是已经固定的,不会超过 65536 ,一个端口表示一对连接,这边说的 几千 -》 几万可能还好一点, 多进程下的 数十万,上百万,有那么 厉害吗??

伊谢尔伦伊谢尔伦2770 days ago927

reply all(2)I'll reply

  • ringa_lee

    ringa_lee2017-04-11 10:27:36

    纠正一个概念:端口总数是一个unsigned short,即65535。这不代表一个服务器只能支撑这么多连接!一个端口对应一个进程,一个进程的连接数更这个进程打开的socket描述符的数量是一致的。而描述符的数量是32位int数量级,当然系统有进程最多描述符的限制,可以通过内核参数来配置,但上个几十万肯定没问题的。

    一个典型的多进程http服务器的工作原理大概是这样的:一个进程负责监听80端口的连接,当连接到来后,对应的描述符被内核创建出来,然后进程找一个相对空闲的子进程来处理这个描述符,即在这个描述符上读写数据。注意这里是子进程,正是因为子进程,才可以在父子进程间传递描述符。如果访问量上来了,子进程的数量不够了,父进程可以酌情创建新的子进程来处理描述符;父进程在一定程度上应当实现简单的负载平衡策略。

    基于多线程的http服务器工作原理其实差不多,把上面的进程改成线程一样可以解释。

    以上阐述跟php没有关系,php只不过是在这些底层的概念和系统调用上封装了而已。大多数人使用php是基于php的脚本解释器。而workerman应该是基于php封装的系统调用实现的http服务。

    reply
    0
  • PHP中文网

    PHP中文网2017-04-11 10:27:36

    • php进程是由php-fpm(fastcgi的实现)管理:master进程会把请求分发到子进程

      • master进程:服务与web server通信

        • 通信实现方式一:http socket(主机+端口),会占用一个端口,所以也就是说这里php-fpm只占用一个端口

        • 通信实现方式二:unix domain socket(进程间通信),是基于.sock文件的方式,不依赖网络协议,所以也就是说理论上不占用端口

      • pool进程:子进程,含解析器,解析脚本

    reply
    0
  • Cancelreply