PHP - 运行方式/模式 - 整理

1.应用场景

主要用于整理出PHP存在的运行方式/模式,弄清楚运行原理。

2.学习/操作

1.文档阅读

带你认识PHP运行模式-php教程-PHP中文网

2.整理输出

2.1 运行方式/模式

PHP有两种方式

CLI 和 WEB 方式

即直接通过命令行下,执行PHP脚本:

如:php index.php 

或者

通过浏览器/curl/postman等工具,本质上是通过http协议「也可以是ws协议,tcp,udp协议等」

通过网络进行访问,然后执行PHP脚本

插入

CLI还支持交互式Shell 「解释性脚本语言通常都支持,如,python,lua,js都是支持的」

PHP: 交互式 shell - Manual

 

这里本机操作:

➜  ~ php -a

Interactive shell

php > print 123;

123

php >

➜  ~ cat ~/.php_history

_HiStOrY_V2_

echo\040'sadfs';

echo\040"hello\040world"

;

$a\040=\040test();\040function\040test(){return\040123;}\040echo\040$a;

echo\040123;

ehco\040ceil(1.1);

echo\040123

;

clear

clear

echo\040ceil(1.1);

echo\040ceil(1.1);

clear;

clear

;

echo\040ceil(1.1);

print_r([1.2]);

print([1.2]);

cls

echo\040strtotime('2017/10/9');

echo\040strtotime('2017/10/9');

echo\040.$str\040=\040"aabbccdd";\040str_replace('a',\040'e',\040$str);

echo\040$str\040=\040"aabbccdd";\040str_replace('a',\040'e',\040$str);

echo\040str_replace('a',\040'e',\040$str);

echo\040__FILE__;

echo\040strip_tags("Hello\040<b><i>world!</i></b>","<b>");

$string\040=\040'

$string\040=\040trim(trim($string,"

echo\040$string;

var\040$string;

var_dunp($string);

clear

;

var_dump($string);

$list\040=\040swoole_get_local_ip();

print_r($list);

print\040swoole_get_local_mac();

print\040swoole_get_local_mac()

;

$ret\040=\040swoole_get_local_mac();

var_dump($ret);

print\040123;

➜  ~

➜  ~

但是清屏幕的方式,TBD

但web方式分为4种运行模式,加上cli, 方式共有5种

不过有些模式,已经淘汰了,了解即可。

1. CGI(通用网关接口/ Common Gateway Interface)
2. FastCGI(常驻型CGI / Long-Live CGI)
3. LoadModule【Apache独有】
4. ISAPI(Internet Server Application Program Interface)【IIS独有】
5. CLI(命令行运行 / Command Line Interface)

备注:

在PHP5.3以后,PHP不再有ISAPI模式,安装后也不再有php5isapi.dll这个文件。

要在IIS6上使用高版本PHP,必须安装FastCGI 扩展,然后使IIS6支持FastCGI。

2.2 查看当前运行模式

通过函数:

php_sapi_name();

终端CLI下:可以看到输出的是: cli

浏览器访问:可以看到是:fpm-fcgi

2.3 模式介绍

1). CGI模式

介绍:

CGI即通用网关接口(Common Gateway Interface),它是一段程序,通俗的讲CGI就象是一座桥,把网页和Web服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器的执行程序,再把服务器执行程序的结果返还给HTML页。

CGI 的跨平台性能极佳,几乎可以在任何操作系统上实现。

调用过程:「Fork-And-Execute模式

用户请求 —> web服务器接收请求【常用Nginx、apache】—> fork CGI的子进程&处理请求 —-> 请求处理完毕,返回结果到web服务器&销毁子进程 —> web服务器返回结果给用户

图解:


优势:

作为PHP最早的运行模式,每次请求都独立处理,调用过程足够简单清晰,可控性强
进程间是隔离的,保证数据不会被污染

劣势:

每次请求都需要fork一个新的CGI子进程,假如同一时间并发请求一千,意味着就要fork一千个子进程,这就会导致几个问题:

  1. fork子进程需要时间,需要占用内存【copy-on-write】
  2. 子进程过多,会导致CPU将大量的时间花费在上下文切换上
  3. 每次请求需要重新加载相关资源

2). FastCGI模式

介绍:

FastCGI是CGI的升级版本,FastCGI像是一个常驻 (long-live)型的 CGI,在启动web服务器的时候载入FastCGI进程管理器【PHP-FPM、IIS ISAPI、Apache Module】,当有请求过来的时候,web服务器只需要交给FastCGI进程管理器处理即可。

突然问题:

fastcgi方式包括 PHP-FPM、IIS ISAPI、Apache Module ?

TBD

调用过程:以 PHP-FPM 为例

web服务器启动的时候 启动 PHP-FPM master进程(主要负责分配请求给空闲的自子进程处理)以及一定数量的fast-cgi子进程(负责处理请求)。 PHP-FPM master进程管理一个进程池,池里有若干个fast-cgi子进程,每个fast-cgi子进程单独处理一个请求,互不干涉。

用户请求 —> web服务器接收请求【常用Nginx、apache】—> 检测到是PHP请求&转发给FPM master进程 —> FPM master进程 指定空闲fast-cgi子进程处理请求 —> 子进程载入文件(如php.ini)及其他资源处理请求 —> 处理结束&清除资源,结果返回master & 子进程挂起,标记为空闲—> master 将结果返回web服务器 —> web服务器返回结果给用户

图解:


优势:

  1. 从稳定性上看,FastCGI是以独立的进程池来运行CGI,单独一个进程死掉,系统可以很轻易的丢弃,然后重新分配新的进程来运行逻辑
  2. 从安全性上看,FastCGI和宿主的web Server完全独立,FastCGI 不会影响web 服务器的运行【如果PHP-FPM处于关闭状态,则会返回502 bad gateway 给用户】
  3. 从性能上看,FastCGI把动态逻辑的处理从 web Server中分离出来,大负荷的IO处理还是留给宿主Server,这样宿主Server可以一心一意作IO【对于一个普通的动态网页来说, 逻辑处理可能只有一小部分,更多的是图片等静态资源的加载】

劣势:

一个fast-cgi子进程同一时间只能处理一个请求,所以网站的并发性能就受限于子进程数量
如果开启的进程过多,会导致CPU将大量的时间浪费在进程的上下文切换上。
每次请求fast-cgi子进程都需要重新加载相关资源,请求结束需要释放资源

3). LoadModule(Apache独有)

简介:
模块模式是以mod_php5模块的形式集成,此时mod_php5模块的作用是接收Apache传递过来的PHP文件请求,并处理这些请求,然后将处理后的结果返回给Apache。
在Apache配置文件httpd.conf里,通常加的LoadModule php7_module “D:/…/php71/php7apache2_4.dll”起到的作用就是这个.

调用过程:

用户请求 —> Apache 服务器 —> 调用mod_php5模块处理请求 —> 返回请求结果给Apache —> Apache 返回结果给用户

图解:

4). ISAPI(Internet Server Application Program Interface)

简介:

在PHP5.3以后,PHP不再有ISAPI模式,安装后也不再有php5isapi.dll这个文件。要在IIS6上使用高版本PHP,必须安装FastCGI 扩展,然后使IIS6支持FastCGI。故此处不做过多介绍

图解:

5). CLI(命令行运行 / Command Line Interface)

简介:

php-cli模式属于命令行模式, 对于很多刚开始学php就开始wamp, wnmp的开发者来说是最陌生的一种运行模式, 该模式不需要借助其他程序, 直接输入php xx.php 就能执行php代码.

命令行模式和常规web模式明显不一样的是:

没有超时时间
默认关闭buffer缓冲
STDIN和STDOUT标准输入/输出/错误 的使用
echo var_dump,phpinfo等输出直接输出到控制台
可使用的类/函数 不同
php.ini配置的不同「未必,需要确认

PS:详见官方文档:www.php.net/manual/zh/features.com...

写在最后:

在互联网爆炸式发展的今天,绝大多数网站都需要考虑网站的高并发性能。

Nginx由于其轻量和出色的并发性能等优点,越来越多的受到开发者的青睐。

曾经火爆全网的 LAMP 组合已不是PHP开发者的第一选择,异军突起的 LNMP 组合已然成为 PHPer 的必修课,这导致基于 Apache 的LoadModule模式已越来越少被提及。


除此以外,用来写命令行脚本CLI模式和几乎绝迹的 ISAPI 模式显然不适合建设网站。


作为 CGI 加强版的 Fast-CGI 模式在继承了 CGI 简单、安全的基础上,使用PHP-FPM管理子进程,使得web服务器更加专注的处理I/O,PHP-FPM管理维护一个进程池,可提前 fork 一定数量的子进程等待处理请求,既不用在请求到来时才fork子进程,也不用在请求结束时就销毁子进程。

后续补充

...

3.问题/补充

TBD

4.参考

参见上面文档列表

后续补充

...

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值