CGI FastCGI php-cgi php-fpm 线程和进程,当前的认识
twocode

cgi.png

文字说明:

 CGI FastCGI php-cgi php-fpm  

cgi => FastCGI(快速通用网关接口):

工作原理

a)Web Server 启动时载入FastCGI进程管理器 (IIS或Apache Module)(nginx或者apache启动时,加载php功能模块,即加载php-fpm);

b)FastCGI进程管理器(php-fpm)首先初始化自己,启动一批CGI解释器进程(可见多个php-cgi),然后等待来自Web Server的连接。

c)当Web Server中的一个客户端请求达到时(nginx主进程master管理子进程worker的数量,worker负责处理请求,当请求的php程序时,调用php), FastCGI进程管理器(php-fpm)会选择并连接一个CGI解释器。Web server的CGI环境变量和标准输入会被送达FastCGI进程的php-cgi。

d)FastCGI子进程从同一连接完成返还给Web Server的标准输出和错误信息。当请求进程完成后,FastCGI进程会关闭此连接,释放内存。FastCGI会等待来自FastCGI进程管理器(运行在Web Server中的)的下一个连接; 而在CGI模式,php-cgi然后会退出。

php-cgi =>php-fpm

PHP-FPM提供了更好的PHP进程管理方式,

可以有效控制内存和进程

可以平滑重载PHP配置

比spawn-fcgi具有更多优点

线程和进程

1.概念区别         线程是可执行代码的可分派单元。这个名称来源于“执行的线索”的概念。在基于线程的多任务的环境中,所有进程有至少一个线程,但是它们可以具有多个任务。这意味着单个程序可以并发执行两个或者多个任务。

简而言之,线程就是把一个进程分为很多片,每一片都可以是一个独立的流程。这已经明显不同于多进程了,进程是一个拷贝的流程,而线程只是把一条河流截成很多条小溪。它没有拷贝这些额外的开销,但是仅仅是现存的一条河流,就被多线程技术几乎无开销地转成很多条小流程,它的伟大就在于它少之又少的系统开销。(当然伟大的后面又引发了重入性等种种问题,这个后面慢慢比较)。

2.PHP是单线程的,php-fpm管理多个php-cgi(多进程)

    PHP确实没有多线程,因此不能在代码里再开一个线程去执行其他任务,不能像java一样,同一时刻有多条主线逻辑在执行.

但是这和大访问量并没有多大关系, 因为请求过来,是nginx或apache处理的,然后调用php处理,

调用可以是同时进行的,但是各进程之间是独立进行的,独立访问脚本,即每个用户(客户端浏览器)都会对应服务器的一个php脚本进程,执行过后(页面被打开),进程就被销毁,内存得到释放.

那单例模式中

if($instance == null) {

$instance = new instance();

}

这块会不会因为服务器调用多个php脚本进行处理,两个调用同时进行了,从而导致new出两个instance呢?

会啊, 单例模式在PHP中只会正对当前运行的脚本, 你也指出了, 是要先检测$instance  是否为空的, 这仅仅局限于本次运行的脚本不会new出多个对象

3.不足

进程比线程消耗更多内存: PHP-CGI解释器每进程消耗7至25兆内存(参考:https://github.com/YuanLianDu/YLD-with-Php/blob/master/articles/php/php-fpm.md);

Nginx 0.8.46+PHP 5.2.14(FastCGI)服务器在3万并发连接下,开启的10个Nginx进程消耗150M内存(15M*10=150M),开启的64个php-cgi进程消耗1280M内存(20M*64=1280M)(参考:http://zyan.cc/nginx_php_v6/)

4.个人总结:

进程是客观的,系统级别的服务,有pid标识的;线程是某一进程中的逻辑代码执行的顺序(单进程是串行代码;多线程是并行代码)。



网友评论已关闭