【浅谈】WEB请求到PHP的过程

0)前言

近期打算从头复习下PHP/编程相关的基础知识,发现对一些模块都还只是一知半解,有些甚至连一知都达不到。故此决定写些文章记录心得、整理笔记加强记忆,也希望能帮助到新手。

1)介绍

在开始整理流程前先简单介绍几个后面可能会用到的知识点,这里只是简单的概要一下,想深入了解的可以看自行搜索相应的文章,了解的同学可直接跳过。

cgi

CGI是一种协议,专门用来和WEB服务器打交道的,是为了保证传递过来的数据是标准格式的。WEB服务器收到用户请求就会把请求提交给CGI程序,CGI程序根据请求提交的参数作相应处理,然后输出标准的HTML语句返回给WEB服务器,再返回给客户端,这就是普通CGI的工作原理。

通俗的来讲CGI就像是一根管子,浏览器/HTML页面的请求需要遵守这根管子的协议才能通过管子和WEB服务器中的执行程序连通,它把浏览器/HTML页面请求传递给服务器的执行程序,再把服务器执行程序的结果再返还给浏览器/HTML页面

fast-cgi

FAST-CGI是一种协议,统管CGI程序的运行。因为CGI每次接收WEB请求都会启动退出过程,当大并发量时资源开销大容易歇菜,所以就产生了FAST-CGI,FAST-CGI是早早就启动好了的,运行着等待请求,接到请求执行结束后不会退出,继续等待下个请求

php-cgi:

PHP-CGI是PHP提供给WEB服务器的CGI协议接口程序,每当接收到WEB服务器请求都会创建一个PHP-CGI进程进行处理,处理结束后销毁。如果更新了PHP配置,那么就需要重启PHP-CGI才能生效。

php-fpm:

PHP-FPM是PHP提供给WEB服务器的FAST-CGI协议接口程序,它不会像PHP-CGI处理请求一样要不断的创建销毁进程,而是可以一个进程重复利用处理多个请求,每处理完一个请求就开始等待处理下一个请求。支持平滑过渡配置更改。PHP-FPM算是PHP-CGI的管理器,一些比较旧的版本运行时查看进程时还是能看到PHP-FPM和PHP-CGI同时出现的,后来PHP-FPM被整合到内核后查看进程只会显示PHP-FPM。

2)过程

首先通过浏览器,输入域名发起请求,浏览器将判断输入的是IP/端口还是域名,如果是域名浏览器会通过DNS服务器去获取域名对应的IP/端口;

浏览器通过IP/端口向对应的服务器发起(HTTP协议)请求,WEB请求默认是80端口,由于Web服务器监听80端口,所以由WEB服务器(Apache,Nginx等)进行接收处理响应;

到这步讲两种常见的模式:

1.Nginx+PHP-FPM

这种方式,Nginx会根据配置文件中的server部分进行处理。根据下面代码配置中的location配置的规则来判断该请求的URI的类型(例如index.html,index.php,test.jpg等),如果是静态资源(例如test.jpg等)则直接将资源返回。这里假设是PHP文件,PHP文件则需要经过对应的解释器PHP-FPM/PHP-CGI(这种已经不常用了后续只提PHP-FPM)进行处理。但Nginx不能直接和PHP-FPM通信,所以会交给FAST-CGI模块处理。FAST-CGI根据下面代码配置中的fastcgi_pass127.0.0.1:9000(以具体配置为准),找到PHP-FPM,Nginx 会将所有的 PHP 请求翻译成 FASTCGI请求之后再发送到这个地址。

server {
        listen       80;
        server_name  demo.code.com;
        root   "/WWW/code";
        location / {
            index  index.html index.htm index.php;
            #autoindex  on;
            if (!-e $request_filename) {
                rewrite ^(.*)$ /admin.php?s=/$1 last;
                break;
            }
        }
        location ~ \.php(.*)$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
        }
}

这里简单说一些PHP-FPM的Master和Worker进程,PHP-FPM有Master进程和Worker进程如下所示,Master进程只有一个,用于监听端口及分配Worker进程处理任务,而Worker进程则有多个,每个进程都嵌入了PHP解释器,是PHP代码真正执行的地方,具体的数量可以配置死,也可以配置根据请求量自适应。

-bash-4.1$ ps -ef | grep fpm
root      1297     1  0 Apr22 ?        00:07:25 php-fpm: master process (/usr/local/php7/etc/php-fpm.conf)                                                               
apache    1642  1297  0 Apr22 ?        00:01:22 php-fpm: pool www                                                                                                        
apache    2929  1297  0 Jul21 ?        00:00:00 php-fpm: pool www                                                                                                        
apache    2941  1297  0 Jul24 ?        00:00:00 php-fpm: pool www                                                                                                        
apache    3509  1297  0 Jul18 ?        00:00:00 php-fpm: pool www                                                                                                        
apache    5724  1297  0 Jul16 ?        00:00:00 php-fpm: pool www                                                                                                        
apache    5732  1297  0 May27 ?        00:00:00 php-fpm: pool www                                                                                                        
apache    5794  1297  0 Jun11 ?        00:00:00 php-fpm: pool www                                                                                                        
apache    6093  1297  0 May27 ?        00:00:00 php-fpm: pool www                                                                                                        
apache    6902  1297  0 Jun13 ?        00:00:00 php-fpm: pool www                                                                                                        
apache    7107  1297  0 12:33 ?        00:00:00 php-fpm: pool www                                                                                                        
apache    7785  1297  0 May24 ?        00:00:06 php-fpm: pool www                                                                                                        
apache    7859  1297  0 Jul18 ?        00:00:00 php-fpm: pool www                                                                                                        
apache    8101  8083  0 13:58 pts/3    00:00:00 grep fpm

回到过程中,PHP-FPM的Master进程监听到Nginx请求,Master进程会分配一个处于空闲状态的Worker进程,Worker进程解析/执行请求,并将执行结束结果返回给Nginx,Nginx再将结果原路返回。

2.Apache+mod_php5

这种方式,Apache将PHP作为自己的一个子模块来运行,当请求的文件是PHP文件时,Apache就调用mod_php5来解析PHP代码

文章主要侧重讲请求到WEB服务器直至PHP中的应用调用过程,中间细致的过程肯定不止这么多,例如请求到服务器经历的网络七层协议等等,感兴趣的人可以去查下相关的资料。首次发文有什么不对的地方欢迎评论区指出,多多探讨。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354