Heim >Backend-Entwicklung >PHP-Tutorial >PHP在什么情况下会使用多进程?

PHP在什么情况下会使用多进程?

WBOY
WBOYOriginal
2016-06-06 20:42:221205Durchsuche

我在某PHP大牛上面看到这样一段话:

 我之前的文章中说过,大多数网站的性能瓶颈不在PHP服务器上,因为它可以简单地通过横向增加服务器或CPU核数来轻松应对(对于各种云主机,增加VPS或CPU核数就更方便了,直接以备份镜像增加VPS,连操作系统、环境都不用安装配置),而是在于MySQL数据库。如果用 MySQL 数据库,一条联合查询的SQL,也许就可以处理完业务逻辑,但是,遇到大量并发请求,就歇菜了。如果用 NoSQL 数据库,也许需要十次查询,才能处理完同样地业务逻辑,但每次查询都比 MySQL 要快,十次循环NoSQL查询也许比一次MySQL联合查询更快,应对几万次/秒的查询完全没问题。如果加上PHP多线程,通过十个线程同时查询NoSQL,返回结果汇总输出,速度就要更快了。我们实际的APP产品中,调用一个通过用户喜好实时推荐商品的PHP接口,PHP需要对BigSea NoSQL数据库发起500~1000次查询,来实时算出用户的个性喜好商品数据,PHP多线程的作用非常明显。

我的理解是这样的.PHP与MYSQL结合的话,根本用不了多线程或者多进程的这样的东西.
因为一个sql查询,只可能在一个进程里面.
而nosql不一样了.我可以讲很复杂的查询分成10个小查询,用每个单独的线程去查询nosql再汇总..就比使用一个现程或者进程快.

还有一种多进程的使用场景是不是日志系统?
那么多进程,运行的信息肯定要写在一个日志文件里面.
就要考虑读写的同步了.

那么问题来了:
1 .挖掘机学校哪家强?
2 .PHP在什么情况下需要使用到多进程(多线程)?
3 .PHP在什么情况下需要考虑到多进程(多线程)读写的同步呢(比如日志系统)?

还有一个问题,我现在感觉到了一丝迷惑.就是假设用户上传了一张图片,其他用户来访问.那么就有很多的PHP进程来读这张图片.是不是当一个进程在读的时候,另外的进程就要等待了?
那比如我的PHP有一万个进程,那等1000个进程读这个文件的时候,用户不就等了很长时间吗??

服务器的资源都是共用的,那么多PHP进程来读他,怎么还那么快呢??

回复内容:

我在某PHP大牛上面看到这样一段话:

 我之前的文章中说过,大多数网站的性能瓶颈不在PHP服务器上,因为它可以简单地通过横向增加服务器或CPU核数来轻松应对(对于各种云主机,增加VPS或CPU核数就更方便了,直接以备份镜像增加VPS,连操作系统、环境都不用安装配置),而是在于MySQL数据库。如果用 MySQL 数据库,一条联合查询的SQL,也许就可以处理完业务逻辑,但是,遇到大量并发请求,就歇菜了。如果用 NoSQL 数据库,也许需要十次查询,才能处理完同样地业务逻辑,但每次查询都比 MySQL 要快,十次循环NoSQL查询也许比一次MySQL联合查询更快,应对几万次/秒的查询完全没问题。如果加上PHP多线程,通过十个线程同时查询NoSQL,返回结果汇总输出,速度就要更快了。我们实际的APP产品中,调用一个通过用户喜好实时推荐商品的PHP接口,PHP需要对BigSea NoSQL数据库发起500~1000次查询,来实时算出用户的个性喜好商品数据,PHP多线程的作用非常明显。

我的理解是这样的.PHP与MYSQL结合的话,根本用不了多线程或者多进程的这样的东西.
因为一个sql查询,只可能在一个进程里面.
而nosql不一样了.我可以讲很复杂的查询分成10个小查询,用每个单独的线程去查询nosql再汇总..就比使用一个现程或者进程快.

还有一种多进程的使用场景是不是日志系统?
那么多进程,运行的信息肯定要写在一个日志文件里面.
就要考虑读写的同步了.

那么问题来了:
1 .挖掘机学校哪家强?
2 .PHP在什么情况下需要使用到多进程(多线程)?
3 .PHP在什么情况下需要考虑到多进程(多线程)读写的同步呢(比如日志系统)?

还有一个问题,我现在感觉到了一丝迷惑.就是假设用户上传了一张图片,其他用户来访问.那么就有很多的PHP进程来读这张图片.是不是当一个进程在读的时候,另外的进程就要等待了?
那比如我的PHP有一万个进程,那等1000个进程读这个文件的时候,用户不就等了很长时间吗??

服务器的资源都是共用的,那么多PHP进程来读他,怎么还那么快呢??

我的理解是这样的.PHP与MYSQL结合的话,根本用不了多线程或者多进程的这样的东西. 因为一个sql查询,只可能在一个进程里面.
而nosql不一样了.我可以讲很复杂的查询分成10个小查询,用每个单独的线程去查询nosql再汇总..就比使用一个现程或者进程快

还有更高效的方法,利用IO复用,原理就是一个进程(线程)中,把10查询批量发送出去,然后批量等待结果。这样就少了线程创建及相互通讯的开销,更快速高效。php中可以利用mysqli的异步功能来实现,也可以用socket_select/stream_select实现

2 .PHP在什么情况下需要使用到多进程(多线程)?

一般是当现有架构例如nginx+fpm 无法不支持需求时,例如需要非HTTP协议的通讯,PHP的长链接通讯,nginx+fpm架构很难做到,就需要PHP多进程了,用一堆PHP进程(线程)监听某个端口,解析协议维持链接等。非HTTP协议及长链接应用可以用workerman这类的框架,是一个常驻内存的多进程socket服务器框架

3 .PHP在什么情况下需要考虑到多进程(多线程)读写的同步呢?

当多个进程(线程)读写同一个文件时,就要考虑同步或者说互斥,不能一个进程刚写了一半另外一个进程就去读

那比如我的PHP有一万个进程,那等1000个进程读这个文件的时候,用户不就等了很长时间吗??

读取可以并发的读,不用排队。写需要排队。

服务器的资源都是共用的,那么多PHP进程来读他,怎么还那么快呢??

多进程快是因为利用了系统多核的资源,如果是单核,一般会比单进程慢

不知道你引用的文章是哪里的,我并不同意其中的观点,因此我们先说你引用的片段中描述的观点有什么问题:

  • 并发上来之后,应该通过缓存来解决问题,只要进行了恰当的缓存,SQL 或 NoSQL 并不是性能的决定性因素。
  • 在服务器资源(CPU 和内存)没有用满的前提下,多线程才会提高性能;而如果资源已经用尽了,多少线程都没用。所以关键是如何将服务器资源恰当地用满。

然后关于 PHP 与多线程:

严格来说 PHP 的多线程指的应该是 pecl 中的 pthreads. 这个东西很少有人会用到,我也不建议大家用,因为通常情况需要用到 pthreads 的时候通常是这个工作不适合 PHP 来做。

如果说 PHP 和多线程有什么关系,那就是 PHP 不同于其他的一些后端语言,通常 PHP 的运行环境是由 PHP-FPM 管理的若干个独立的 PHP 进程组成的。因此 PHP 天然地可以非常方便地横向扩充:增加 PHP-FPM 的进程数,甚至把 PHP-FPM 分散在两台服务器上。

所以说了这么多,你的两个问题无从谈起了...

保持简单,PHP之所有成功就是其简单的每一个请求一次加载所有资源,处理完释放所有资源,任何性能相关的计算,可以转接到其它更加适合的语言上,比如java服务,典型的如solr搜索
不过,随着hhvm环境,swool(应该是它)扩展的慢慢成熟,php也可以常驻内存了,那这个时候,会有相应的扩展来做多线程操作,甚至会有协程库~

我们用到的多进程,都不在Web中,感觉是找死。Web业务使用fpm加进程池就可以了。

多进程的业务,一般用在php写的shell工具中,比如单线程计算每天的数据比较慢,多开几个进程会快一些;还用socket写的后台业务需要生成子进程去处理等。

回答不满意,暂时清空。

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