Heim  >  Artikel  >  Backend-Entwicklung  >  socket - 使用php多线程 , 多进程??

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

WBOY
WBOYOriginal
2016-09-21 14:13:141363Durchsuche

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

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

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

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

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

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

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

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

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

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

回复内容:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn