>백엔드 개발 >PHP 튜토리얼 >PHP在什么情况下会使用多进程?

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

WBOY
WBOY원래의
2016-06-06 20:42:221205검색

我在某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写的后台业务需要生成子进程去处理等。

回答不满意,暂时清空。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.