文字说明:
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标识的;线程是某一进程中的逻辑代码执行的顺序(单进程是串行代码;多线程是并行代码)。
- SSL和SSL证书 2015-04-12
- HTTP和HTTPS 2015-04-12
- W3C 2015-04-12
- 简述HTTP协议 2015-04-12
- 山猫、黄蜂和鹈鹕的渊源 2015-04-05