目录
Web服务器和动态语言如何交互--CGI&FastCGI&FPM浅谈,web服务器交互--cgi
首页 php教程 php手册 Web服务器和动态语言如何交互--CGI&FastCGI&FPM浅谈,web服务器交互--cgi

Web服务器和动态语言如何交互--CGI&FastCGI&FPM浅谈,web服务器交互--cgi

Jun 13, 2016 am 09:14 AM
amp fastcgi fpm web 交互 动态 如何 服务器 语言

Web服务器和动态语言如何交互--CGI&FastCGI&FPM浅谈,web服务器交互--cgi

一个用户的Request是如何经过Web服务器(Apache,Nginx,IIS,Light)与后端的动态语言(如PHP等)进行交互并将结果返回给用户的呢?

本文浅谈个人观点,可能有误,欢迎拍砖,共同学习。

 

一. 首先明确几个概念,以便后续说明

CGI:(Common Gateway Interface)Http服务器与后端程序(如PHP)进行交互的中间层。

工作原理及处理方式(fork-and-execute模式):

1.当Web Server有Request到达

2.fork一个CGI进程或线程(配置管理,环境初始化)

3.执行后台脚本

4.将结果返回Web服务器。

5.Web服务器将结果返回给用户。

FastCGI:常驻型(long-live)CGI形式,经过激活后,不会每次都要花时间去fork。

工作原理及处理方式:

1.Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)

2.FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi进程),并等待来自Web Server的连接

3.当有客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器;Web Server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。

4.FastCGI子进程完成处理后将标准输出和错误信息返回Web Server。当FastCGI子进程关闭连接时,请求便告知处理完成。子进程继续响应来自FastCGI进程管理器分配的其他请求。

 

PHP-FPM:只用于PHP的PHP FastCGI 进程管理器。

PHP5.3.3以后的版本已经集成了PHP-FPM了。

php-fpm提供了更好的PHP配置管理方式,可以有效控制内存和进程、可以平滑重载php配置。

./configure php源码的时候,加—enable-fpm参数可开启PHP_FMP。

 

Spawn-FCGI:一个普通的FastCGI进程管理器。

 

二. PHP中的CGI实现:

PHP的CGI实现本质上是以Socket编程实现一个TCP或者UDP协议服务器。当启动时, 创建TCP/UDP协议的服务器监听,并接受相关请求进行处理。

CGI的生命周期为:模块初始化;SAPI初始化;请求的处理;模块关闭;SAPI关闭;

以TCP协议为例,在TCP的服务端,会执行如下操作:

1.服务端调用Socket函数创建一个TCP用的流式套接字;

2.服务端调用bind函数将服务器的本地地址与前面创建的套接字绑定;

3.服务调用listen函数将新创建的套接字作为监听,等待客户端发起连接,当客户端有多个连接连接到这个套接字时,可能需要排队处理;

4.服务器调用accept函数进入阻塞状态,直到有客户进程调用connect函数而建立起一个连接;

5.当与客户端创建连接后,服务器调用read_stream函数读取客户的请求;

6.处理完数据后,服务器调用write函数向客户端发送应答。

 

三.目前PHP的工作方式(以Apache服务器为例,因为Apache和Php是好兄弟嘛)

1.Apache Handler方式(php作为Apache服务器的Module)

一种改进的CGI方式,把PHP的解释模块编成so扩展,添加到Apache的modules中。

配置方式:

 <p>1.编译PHP时,加上如下参数:</p> <p>cd php-source</p> <p>./configure --prefix=/home/weiyanyan/local/php --with-apxs2=/home/weiyanyan/local/apache/bin/apxs --with-mysql</p> <p>说明:—with-apxs2为apache中apxs相应目录,将在apache根目录下的modules下生成libphp5.so</p> <p>2.在apache的配置文件http.conf中增加  <p>LoadModule php5_module modules/libphp5.so  <p>然后在<IfModule mime_module>节点下增加如下mime配置  <p>AddType application/x-httpd-php .php<br> </p>
登录后复制

2.CGI模式

前提为不能以模块模式运行。(注释掉:LoadModule php5_module modules/libphp5.so)

在httpd.conf增加action:

Action application/x-httpd-php /cgi-bin/php-cgi

如果在/cgi目录找不到php-cgi,可从php的bin里面cp一个。

【可以写一个PHP脚本,让其sleep(20);运行之前看机器进程中无php-cgi进程,请求的时候,会有相应的进程产生。经测试一个php-cgi进程可以承载多个请求,具体未深究,因为这种方式已经基本没有人用了。】

3.FastCGI模式

FastCGI模式根据进程管理器的不同可以分为:Apache内置进程管理器,php-fpm进程管理器

Apache内置进程管理器:

 <p>mod_fastcgi的安装  <p>#wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz  <p># tar -zxvf mod_fastcgi-2.4.6.tar.gz  <p># cd mod_fastcgi-2.4.6  <p># cp Makefile.AP2 Makefile  <p># vim Makefile 将Makefile中的路径改成你的apache的安装路径  <p># make install 安装成功  <p>安装成功后,会自动把mod_fastcgi.so复制到/usr/local/apache/modules目录  </p>
登录后复制

 

首先要添加fastcgi模块到httpd.conf配置文件:

LoadModule fastcgi_module modules/mod_fastcgi.so

这种模式注释不注释LoadModule php5_module modules/libphp5.so这行貌似没什么关系,只要配置了以下模块


   FastCgiServer /home/weiyanyan/local/apache/cgi-bin/php-cgi -processes 20
   AddType application/x-httpd-php .php

   AddHandler php-fastcgi .php

   Action php-fastcgi /cgi-bin/php-cgi

就会自动走到fastcgi模式。

然后重启apache,这个时候用 ps aux|grep php就会发现有很多php-cgi进程在运行。说明配置生效.

 

FPM方式

首先要添加fastcgi模块到httpd.conf配置文件:

LoadModule fastcgi_module modules/mod_fastcgi.so

这种模式注释不注释LoadModule php5_module modules/libphp5.so这行貌似没什么关系,只要配置了以下模块


FastCgiExternalServer /home/weiyanyan/local/apache/cgi-bin/php-cgi -host 127.0.0.1:9000

AddType application/x-httpd-php .php

AddHandler php-fastcgi .php

Action php-fastcgi /cgi-bin/php-cgi

其中在本机9000端口开启了PHP-Fpm服务

FPM的安装简单介绍如下:

cd php-source

./configure --prefix=/home/weiyanyan/local/php --with-apxs2=/home/weiyanyan/local/apache/bin/apxs --with-mysql --enable-fpm

此时在Php的根目录sbin下会有php-fpm运行程序,其配置文件在php根目录下面的/etc/php-fpm.conf

修改完配置,在apache配置对应的端口启动php-fpm即可。

 

[只是写完,未检查,回家过年…]

 

参考:

http://www.phppan.com/2011/05/php-cgi/

http://www.cnblogs.com/fangbo/archive/2011/12/02/2272400.html

http://blog.zyan.cc/nginx_php_v6/

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

将VirtualBox固定磁盘转换为动态磁盘,反之亦然 将VirtualBox固定磁盘转换为动态磁盘,反之亦然 Mar 25, 2024 am 09:36 AM

在创建虚拟机时,系统会要求您选择磁盘类型,您可以选择固定磁盘或动态磁盘。如果您选择了固定磁盘,后来意识到需要动态磁盘,或者相反,该怎么办?好!你可以把一种转换成另一种。在这篇文章中,我们将看到如何将VirtualBox固定磁盘转换为动态磁盘,反之亦然。动态磁盘是一种虚拟硬盘,它最初具有较小的大小,随着您在虚拟机中存储数据,其大小会相应增长。动态磁盘在节省存储空间方面非常高效,因为它们只占用所需的主机存储空间。然而,随着磁盘容量的扩展,可能会稍微影响计算机的性能。固定磁盘和动态磁盘是虚拟机中常用的

如何将Dnsmasq配置为DHCP中继服务器 如何将Dnsmasq配置为DHCP中继服务器 Mar 21, 2024 am 08:50 AM

DHCP中继的作用是将接收到的DHCP数据包转发到网络上的另一个DHCP服务器,即使这两个服务器位于不同的子网中。通过使用DHCP中继,您可以实现在网络中心部署一个集中式的DHCP服务器,并利用它为所有网络子网/VLAN动态分配IP地址。Dnsmasq是一种常用的DNS和DHCP协议服务器,可以配置为DHCP中继服务器,以帮助管理网络中的动态主机配置。在本文中,我们将向您展示如何将dnsmasq配置为DHCP中继服务器。内容主题:网络拓扑在DHCP中继上配置静态IP地址集中式DHCP服务器上的D

用PHP构建IP代理服务器的最佳实践指南 用PHP构建IP代理服务器的最佳实践指南 Mar 11, 2024 am 08:36 AM

在网络数据传输中,IP代理服务器扮演着重要的角色,能够帮助用户隐藏真实IP地址,保护隐私、提升访问速度等。在本篇文章中,将介绍如何用PHP构建IP代理服务器的最佳实践指南,并提供具体的代码示例。什么是IP代理服务器?IP代理服务器是一种位于用户与目标服务器之间的中间服务器,它充当用户与目标服务器之间的中转站,将用户的请求和响应进行转发。通过使用IP代理服务器

epic服务器离线进不了游戏怎么办?epic离线进不了游戏解决方法 epic服务器离线进不了游戏怎么办?epic离线进不了游戏解决方法 Mar 13, 2024 pm 04:40 PM

  epic服务器离线进不了游戏怎么办?这个问题想必很多小伙伴都有遇到过,出现了此提示就是导致正版的游戏无法启动,那么出现这个问题一般是网络和安全软件干扰导致的,那么应该怎么解决呢,本期小编就来和大伙分享解决方法,希望今日的软件教程可以帮助各位解决问题。  epic服务器离线进不了游戏怎么办:  1、很可能是被安全软件干扰了,将游戏平台和安全软件关闭在重启。  2、其次就是网络波动过大,尝试重启一次路由器,看看是否有效,如果条件可以的话,可以尝试使用5g移动网络来进行操作。  3、然后有可能是更

如何在服务器上安装 PHP FFmpeg 扩展? 如何在服务器上安装 PHP FFmpeg 扩展? Mar 28, 2024 pm 02:39 PM

如何在服务器上安装PHPFFmpeg扩展?在服务器上安装PHPFFmpeg扩展可以帮助我们在PHP项目中处理音视频文件,实现音视频文件的编解码、剪辑、处理等功能。本文将介绍如何在服务器上安装PHPFFmpeg扩展,以及具体的代码示例。首先,我们需要确保服务器上已经安装了PHP以及FFmpeg。如果没有安装FFmpeg,可以按照以下步骤安装FFmpe

探索智能体的边界:AgentQuest,一个全面衡量和提升大型语言模型智能体性能的模块化基准框架 探索智能体的边界:AgentQuest,一个全面衡量和提升大型语言模型智能体性能的模块化基准框架 Apr 11, 2024 pm 08:52 PM

基于大模型的持续优化,LLM智能体——这些强大的算法实体已经展现出解决复杂多步骤推理任务的潜力。从自然语言处理到深度学习,LLM智能体正逐渐成为研究和工业界的焦点,它们不仅能理解和生成人类语言,还能在多样的环境中制定策略、执行任务,甚至使用API调用和编码来构建解决方案。在这种背景下,AgentQuest框架的提出具有里程碑意义,它不仅仅是一个LLM智能体的评估和进步提供了一个模块化的基准测试平台,而且通过其易于扩展的API,为研究人员提供了一个强大的工具,以更细粒度地跟踪和改进这些智能体的性能

vivox60pro语言显示怎么更改 vivox60pro系统语言设置方法 vivox60pro语言显示怎么更改 vivox60pro系统语言设置方法 Mar 23, 2024 am 09:06 AM

1、在手机设置菜单中点击【系统管理】。2、点击【语言】选项。3、选择需要使用的系统语言即可。

Golang 服务器的优势及效用详解 Golang 服务器的优势及效用详解 Mar 20, 2024 pm 01:51 PM

Golang是一种由Google开发的开源编程语言,它具有高效、快速、强大的特点,被广泛应用在云计算、网络编程、大数据处理等领域。作为一种强类型、静态语言,Golang在构建服务器端应用程序时具有诸多优势。本文将详细解析Golang服务器的优势及效用,并通过具体的代码示例来说明其强大之处。1.高性能Golang的编译器能够将代码编译成为本地代

See all articles