主页»PHP»PHP 运转形式

PHP 运转形式

来历:Jochen 发布时刻:2018-04-25 阅览次数:

 SAPI

  这儿所说的 PHP 运转形式, 其实指的是 SAPI (Server Application Programming Interface,服务端运用编程端口 )。SAPI 为 PHP 供给了一个和外部通讯的接口, PHP 便是经过这个接口来与其它的运用进行数据交互的。针对不同的运用场景, PHP 也供给了多种不同的 SAPI ,常见的有:apache、apache2filter、apache2handler、cli、cgi、embed 、fast-cgi、isapi 等等。

php_sapi_name() — 回来 web 服务器和 PHP 之间的接口类型。或许回来的值包含了 aolserver、apache、 apache2filter、apache2handler、 caudium、cgi (直到 PHP 5.3), cgi-fcgi、cli、 cli-server、 continuity、embed、fpm-fcgi、 isapi、litespeed、 milter、nsapi、 phttpd、pi3web、roxen、 thttpd、tux 和 webjames。

  现在 PHP 内置的许多 SAPI 完结都已不再保护或许变的有些非干流了,PHP 社区现在正在考虑将一些 SAPI 移出代码库。 社区对许多功用的考虑是除非真的十分必要,或许某些功用已近十分通用了,不然就在 PECL 库中。

  接下来会对其间五个比较常见的运转形式进行阐明。

 CLI 形式

  CLI( Command Line Interface ), 也便是指令行接口,PHP 默许会装置。经过这个接口,能够在 shell 环境下与 PHP 进行交互 。在终端里输入 php -v,会得到相似下图的成果(装置了 PHP 前提下):

  因为有 CLI 的存在,咱们能够直接在终端指令行里运转 PHP 脚本,就像运用 shell、Python 那样,不必依赖于 WEB 服务器。比方 Laravel 结构中的 Artisan 指令行东西,它其实便是一个 PHP 脚本,用来协助咱们快速构建 Laravel 运用的。

 CGI 形式

CGI(Common Gateway Interface,通用网关接口)是一种重要的互联网技术,能够让一个客户端,从网页浏览器向履行在网络服务器上的程序恳求数据。CGI 描绘了服务器和恳求处理程序之间传输数据的一种规范。

  WEB 服务器仅仅内容的分发者。比方 Nginx,假如客户端恳求了 /index.html,那么 Nginx 会去文件体系中找到这个文件,发送给浏览器,这儿分发的是静态数据;假如客户端现在恳求的是 /index.php,依据装备文件,Nginx 知道这个不是静态文件,需求去找 PHP 解析器来处理,那么它会把这个恳求经过简略处理后交给PHP 解析器。Nginx 会传哪些数据给 PHP 解析器呢?url 要有吧,查询字符串也得有吧,POST 数据也要有,HTTP 恳求头 不能少吧,好的,CGI 便是规则要传哪些数据、以什么样的格局传递给后方处理这个恳求的协议。

  CGI 形式运转原理:当 Nginx 收到浏览器 /index.php 这个恳求后,首先会创立一个对应完结了 CGI 协议的进程,这儿便是 php-cgi(PHP 解析器)。接下来 php-cgi 会解析 php.ini 文件,初始化履行环境,然后处理恳求,再以 CGI 规则的格局回来处理后的成果,退出进程。最终,Nginx 再把成果回来给浏览器。整个流程便是一个 Fork-And-Execute 形式。当用户恳求数量十分多时,会很多抢占体系的资源如内存、CPU 时刻等,构成效能低下。所以在用 CGI 办法的服务器下,有多少个衔接恳求就会有多少个 CGI 子进程,子进程重复加载是 CGI 功用低下的主要原因。

  CGI 形式的长处便是彻底独立于任何服务器,仅仅是做为一个中介:供给接口给 WEB 服务器和脚本言语或许是彻底独立编程言语。它们经过 CGI 协议搭线来完结数据传递。这样做的长处了尽量削减它们之间的相关,使得各自愈加独立、互不影响。

  CGI 形式已经是比较陈旧的形式了,这几年都很少用了。

 FastCGI 形式

FastCGI(Fast Common Gateway Interface,快速通用网关接口)是一种让交互程序与 Web 服务器通讯的协议。FastCGI 是前期通用网关接口(CGI)的增强版别。FastCGI 致力于削减网页服务器与 CGI 程序之间交互的开支,从而使服务器能够一起处理更多的网页恳求。

  依据界说能够知道,FastCGI 也是一种协议,完结了 FastCGI 协议的程序,更像是一个常驻型(long-live)的 CGI 协议程序,只需激活后,它能够一向履行着,不会每次都要花费时刻去 fork 一次。

  FastCGI 形式运转原理:FastCGI 进程办理器发动之后,首先会解析 php.ini 文件,初始化履行环境,然后会发动多个 CGI 协议解说器看护进程 (进程办理中能够看到多个 php-cig 或 php-cgi.exe),并等候来自 WEB 服务器的衔接;当客户端恳求抵达 WEB 服务器时,FastCGI 进程办理器会挑选并衔接到一个 CGI 解说器, WEB 服务器将 CGI环境变量和规范输入发送到 FastCGI 的子进程 php-cgi 中; php-cgi 子进程完结处理后便将规范输出和过错信息回来给 WEB 服务器;此刻 php-cgi 子进程就会封闭衔接,该恳求便处理完毕,接着持续等候并处理来自 FastCGI 进程办理器的下一个恳求衔接。

  FastCGI 形式采用了 C/S 结构,能够将 WEB 服务器和脚本解析服务器分隔,一起在脚本解析服务器上发动一个或许多个脚本解析看护进程。当 WEB 服务器每次遇到动态程序时,能够将其直接交付给 FastCGI 进程来履行,然后将得到的成果回来给浏览器。这种办法能够让 WEB 服务器专注地处理静态恳求或许将动态脚本服务器的成果回来给客户端,这在很大程度上进步了整个运用体系的功用。

  别的,在 CGI 形式下,php-cgi 在 php.ini 装备改变后,需求重启 php-cgi 进程才能让新的 php-ini 装备收效,不能够滑润重启。而在 FastCGI 形式下,PHP-FPM 能够经过生成新的子进程来完结 php.ini 修改后的滑润重启。

PHP-FPM(PHP-FastCGI Process Manager)是 PHP 言语中完结了 FastCGI 协议的进程办理器,由 Andrei Nigmatulin 编写完结,已被 PHP 官方录入并集成到内核中。

  FastCGI 形式的长处:

  1. 从稳定性上看,FastCGI 形式是以独立的进程池来运转 CGI 协议程序,独自一个进程死掉,体系能够很简单的丢掉,然后从头分配新的进程来运转逻辑;
  2. 从安全性上看,FastCGI 形式支撑分布式运算。FastCGI 程序和宿主的 Server 彻底独立,FastCGI 程序挂了也不影响 Server;
  3. 从功用上看,FastCGI 形式把动态逻辑的处理从 Server 中分离出来,大负荷的 I O处理仍是留给宿主 Server,这样宿主 Server 能够全神贯注处理 IO,关于一个一般的动态网页来说, 逻辑处理或许只要一小部分,很多的是图片等静态。

  FastCGI 形式是现在 PHP 干流的 WEB 服务运转形式,具有高效牢靠的功用,引荐咱们运用。

 Module 形式

  PHP 常常与 Apache 服务器调配构成 LAMP 配套的运转环境。把 PHP 作为一个子模块集成到 Apache 中,便是 Module 形式,Apache 中的常见装备如下:

LoadModule php5_module modules/mod_php5.so

  这运用了 LoadModule 指令,该指令的第一个参数是模块的称号,称号能够在模块完结的源码中找到。第二个选项是该模块所在的途径。假如需求在服务器运转时加载模块,能够经过发送信号 HUP 或许 AP_SIG_GRACEFUL 给服务器,一旦承受到该信号,Apache 将从头装载模块,而不需求从头发动服务器。经过注册到 apache2 的 ap_hook_post_config 挂钩,在 Apache 发动的时分发动此模块以承受 PHP 文件的恳求。

  例如,当客户端拜访 PHP 文件时,Apache 就会调用 php5_module 来解析 PHP 脚本。Apache 每接收到一个恳求,都会发生一个进程来衔接 PHP 完结恳求。在 Module 形式下,有时分会因为把 PHP 作为模块编进 Apache,而导致出现问题时很难定位是 PHP 的问题仍是 Apache 的问题。

曩昔,凭借着丰厚的模块和功用,企业往往将 Apache 作为 WEB 服务器,于是以 Module 形式运转的 PHP + Apache 的组合很常见。近些年,以异步工作驱动、高功用的 Nginx 服务器的兴起,市场份额快速增长,以 FastCGI 形式运转的 PHP + Nginx 组合,具有更佳的功用,有赶超 Apache 的趋势。

 ISAPI 形式

  ISAPI(Internet Server Application Program Interface)是微软供给的一套面向 Internet 服务的 API 接口,一个 ISAPI 的 DLL,能够在被用户恳求激活后长驻内存,等候用户的另一个恳求,还能够在一个 DL L里设置多个用户恳求处理函数,此外,ISAPI 的 DLL 运用程序和 WEB 服务器处于同一个进程中,功率要明显高于CGI。因为微软的排他性,只能运转于 Windows 环境。

  用的比较少,在这儿就不做具体介绍了。

QQ群:凯发娱乐官网官方群(515171538),验证音讯:10000
微信群:加小编微信 849023636 邀请您参加,验证音讯:10000
提示:更多精彩内容重视微信大众号:全栈开发者中心(fsder-com)
PHP
网友谈论(共0条谈论) 正在载入谈论......
沉着谈论文明上网,回绝歹意咒骂 宣布谈论 / 共0条谈论
登录会员中心