1、运行模式
SAPI(Server Application Programming Interface)做事器运用程序编程接口, 即PHP与其他运用交互的接口, PHP脚本要实行有很多办法,
通过Web做事器, 或者直接在命令行下, 也可以嵌入在其他程序中。

SAPI供应了一个和外部通信的接口,常见的SAPI有:cgi、fast-cgi、cli、apache模块的DLL、isapi
关于PHP目前比较常见的五大运行模式:
1)CGI(通用网关接口 / Common Gateway Interface)
2)FastCGI(常驻型CGI / Long-Live CGI)
3)CLI(命令走运行 / Command Line Interface)
4)Web模块模式(Apache等Web做事器运行的模式)
5)ISAPI(Internet Server Application Program Interface)
备注:在PHP5.3往后, PHP不再有ISAPI模式, 安装后也不再有php5isapi.dll这个文件。要在IIS6上利用高版本PHP, 必须安装FastCGI 扩展, 然后使IIS6支持FastCGI。
备注:在PHP5.3往后, PHP不再有ISAPI模式, 安装后也不再有php5isapi.dll这个文件。要在IIS6上利用高版本PHP, 必须安装FastCGI 扩展, 然后使IIS6支持FastCGI。
1.1 CGI模式
CGI即通用网关接口(Common Gateway Interface), 它是一段程序, 普通的讲CGI就象是一座桥, 把网页和Web做事器中的实行程序连接起来, 它把HTML吸收的指令通报给做事器的实行程序, 再把做事器实行程序的结果返还给HTML页。
CGI 的跨平台性能极佳, 险些可以在任何操作系统上实现。 CGI已经是比较老的模式了, 这几年都很少用了。
每有一个用户要求, 都会先要创建CGI的子进程, 然后处理要求, 处理完后结束这个子进程, 这便是Fork-And-Execute模式。 当用户要求数量非常多时, 会大量挤占系统的资源如内存, CPU韶光等, 造成效能低下。
以是用CGI办法的做事器有多少连接要求就会有多少CGI子进程, 子进程反复加载是CGI性能低下的紧张缘故原由。
如果不想把 PHP 嵌入到做事器端软件(如 Apache)作为一个模块安装的话, 可以选择以 CGI 的模式安装。或者把 PHP 用于不同的 CGI 封装以便为代码创建安全的 chroot 和 setuid 环境。
这样每个客户机要求一个PHP文件, Web做事器就调用php.exe(win下是php.exe,linux是php)去阐明这个文件, 然后再把阐明的结果以网页的形式返回给客户机。
这种安装办法常日会把 PHP 的可实行文件安装到 web 做事器的 cgi-bin 目录。CERT 建议书 CA-96.11 建议不要把任何的阐明器放到 cgi-bin 目录。
这种办法的好处是把Web Server和详细的程序处理独立开来, 构造清晰, 可控性强, 同时缺陷便是如果在高访问需求的情形下, CGI的进程Fork就会成为很大的做事器包袱,
想象一下数百个并发要求导致做事器Fork出数百个进程就明白了。这也是为什么CGI一贯背负性能低下, 高资源花费的恶名的缘故原由。
1.2 FastCGI模式
FastCGI是CGI的升级版本, FastCGI像是一个常驻 (long-live)型的 CGI, 它可以一贯实行着, 只要激活后, 不会每次都要花费韶光去 Fork 一次(这是 CGI 最为人诟病的 fork-and-execute 模式)。
FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本措辞间通信的接口。多数盛行的HTTP server都支持FastCGI, 包括Apache、Nginx和lighttpd等, 同时, FastCGI也被许多脚本措辞所支持, 个中就有PHP。
FastCGI接口办法采取C/S构造, 可以将HTTP做事器和脚本解析做事器分开, 同时在脚本解析做事器上启动一个或者多个脚本解析守护进程。当HTTP做事器每次碰着动态程序时, 可以将其直接交付给FastCGI进程来实行,
然后将得到的结果返回给浏览器。这种办法可以让HTTP做事器专一地处理静态要求或者将动态脚本做事器的结果返回给客户端, 这在很大程度长进步了全体运用系统的性能。
【事理】
1)Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module);
2)FastCGI进程管理器自身初始化, 启动多个CGI阐明器进程 (可见多个php-cgi.exe或php-cig)并等待来自Web Server的连接;
3)当客户端要求到达Web Server时, FastCGI进程管理器选择并连接到一个CGI阐明器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi;
4)FastCGI子进程完成处理后将标准输出和缺点信息从同一连接返回Web Server。当FastCGI子进程关闭连接时, 要求便告处理完成。
FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接。在正常的CGI模式中, php-cgi.exe在此便退出了。
在CGI模式中, 你可以想象 CGI常日有多慢。每一个Web要求PHP都必须重新解析php.ini、重新载入全部dll扩展并重初始化全部数据构造。利用FastCGI, 所有这些都只在进程启动时发生一次。
一个额外的好处是, 持续数据库连接(Persistent database connection)可以事情。
备注:PHP的FastCGI进程管理器是PHP-FPM(PHP-FastCGI Process Manager)
【优点】
1)从稳定性上看, FastCGI因此独立的进程池来运行CGI, 单独一个进程去世掉, 系统可以很轻易的丢弃, 然后重新分配新的进程来运行逻辑;
2)从安全性上看, FastCGI支持分布式运算。FastCGI和宿主的Server完备独立, FastCGI怎么down也不会把Server搞垮;
3)从性能上看, FastCGI把动态逻辑的处理从Server等分离出来, 大负荷的IO处理还是留给宿主Server, 这样宿主Server可以齐心专心一意作IO, 对付一个普通的动态网页来说, 逻辑处理可能只有一小部分, 大量的是图片等静态。
【缺陷】
说完了好处, 也来说说缺陷。从我的实际利用来看, 用FastCGI模式更适宜生产环境的做事器。但对付开拓用机器来说就不太得当。
由于当利用 Zend Studio调试程序时, 由于 FastCGI会认为 PHP进程超时, 从而在页面返回 500缺点。这一点让人非常恼火, 以是我在开拓机器上还是换回了 ISAPI模式。
对某些做事器的新版本支持不好, 对分布式负载均衡没哀求的模块化安装是否是更好的选择。目前的FastCGI和Server沟通还不足智能, 一个FastCGI进程如果实行韶光过长会被当成是去世进程杀掉重起,
这样在处理永劫光任务的时候很麻烦, 这样做也使得FastCGI无法许可联机调试。由于是多进程, 以是比CGI多线程花费更多的做事器内存, PHP-CGI阐明器每进程花费7至25兆内存, 将这个数字乘以50或100便是很大的内存数。
1.3 CLI模式
PHP-CLI是PHP Command Line Interface的简称, 犹如它名字的意思, 便是PHP在命令走运行的接口, 差异于在Web做事器上运行的PHP环境(PHP-CGI, ISAPI等)。 也便是说, PHP不单可以写前台网页, 它还可以用来写后台的程序。
PHP的CLI Shell脚本适用于所有的PHP上风, 使创建要么支持脚本或系统乃至与GUI运用程序的做事端, 在Windows和Linux下都是支持PHP-CLI模式的。
PHP 供应了一种新类型的 CLI SAPI(Server Application Programming Interface, 做事端运用编程端口)支持, 名为 CLI, 意为 Command Line Interface, 即命令行接口。
顾名思义, 该 CLI SAPI 模块紧张用作 PHP 的开拓外壳运用。CLI SAPI 和其它 CLI SAPI 模块比较有很多的不同之处, 我们将在本章中详细阐述。值得一提的是,CLI 和 CGI 是不同的 SAPI,只管它们之间有很多共同的行为。
在命令行下, 运行 php -v 便能得知该 php 是 CGI 还是 CLI。请参考函数 php_sapi_name() 以及常量 PHP_SAPI。
if(PHP_SAPI == 'cli'){echo "该PHP脚本属于cli模式";}else{echo "该PHP脚本不属于cli模式";}
以下例子检测了子字符串 cgi, 由于它也有可能会是 cgi-fcgi。
<?php$sapi_type = php_sapi_name ();if(substr($sapi_type , 0 , 3 ) == 'cgi' ) { echo "You are using CGI PHP\n" ;}eleeif(substr($sapi_type , 0 , 3 ) == 'cli' ){ echo "You are using CLI PHP\n" ;}else{ echo "You are not using CGI PHP\n" ;}?>
提醒: PHP 常量 PHP_SAPI 具有和 php_sapi_name() 相同的值, 多用于实行操持任务的PHP脚本的CLI模式的判断
【优点】
1)利用多进程, 子进程结束往后, 内核会卖力回收资源;
2)利用多进程, 子进程非常退出不会导致全体进程Thread退出, 父进程还有机会重修流程;
3)一个常驻主进程, 只负任务务分发, 逻辑更清楚。
我们在Linux下常常利用"php –m"查找PHP安装了那些扩展便是PHP命令走运行模式;有兴趣的同学可以输入"php –h"去深入研究该运行模式。
php命令行用法简介
php -m 查看安装的扩展
php -v 查看PHP版本
php -i 输出无html格式的phpinfo
php -ini php加载ini配置文件的数量、路径信息
php -h 显示帮助
php -l 语法检讨PHP文件 php -l somefile.php(PHP Parse error: unexpected T_STRING in /tmp/somefile.php on line 81)
查看扩展目录安装的位置
php -i | grep extension_dir
1.4 模块模式
模块模式因此mod_php5模块的形式集成, 此时mod_php5模块的浸染是吸收Apache通报过来的PHP文件要求, 并处理这些要求, 然后将处理后的结果返回给Apache。
如果我们在Apache启动前在其配置文件中配置好了PHP模块(mod_php5), PHP模块通过注册apache2的ap_hook_post_config挂钩, 在Apache启动的时候启动此模块以接管PHP文件的要求。
除了这种启动时的加载办法, Apache的模块可以在运行的时候动态装载, 这意味着对做事器可以进行功能扩展而不须要重新对源代码进行编译, 乃至根本不须要停滞做事器。
我们所须要做的仅仅是给做事器发送旗子暗记HUP或者AP_SIG_GRACEFUL关照做事看重新载入模块。但是在动态加载之前, 我们须要将模块编译成为动态链接库。此时的动态加载便是加载动态链接库。
Apache中对动态链接库的处理是通过模块mod_so来完成的, 因此mod_so模块不能被动态加载, 它只能被静态编译进Apache的核心。这意味着它是随着Apache一起启动的。
Apache是如何加载模块的呢?我们以前面提到的mod_php5模块为例。首先我们须要在Apache的配置文件httpd.conf中添加一行:
LoadModule php5_module modules/mod_php5.so
这里我们利用了LoadModule命令, 该命令的第一个参数是模块的名称, 名称可以在模块实现的源码中找到。第二个选项是该模块所处的路径。如果须要在做事器运行时加载模块, 可以通过发送旗子暗记HUP或者AP_SIG_GRACEFUL给做事器,
一旦接管到该旗子暗记, Apache将重新装载模块, 而不须要重新启动做事器。
该运行模式是我们以前在windows环境下利用apache做事器常常利用的, 而在模块化(DLL)中, PHP是与Web做事器一起启动并运行的。(它是apache在CGI的根本上进行的一种扩展, 加快PHP的运行效率)。
1.5 ISAPI模式
ISAPI(Internet Server Application Program Interface)是微软供应的一套面向Internet做事的API接口, 一个ISAPI的DLL, 可以在被用户要求激活后长驻内存, 等待用户的另一个要求,
还可以在一个DLL里设置多个用户要求处理函数, 此外, ISAPI的DLL运用程序和WWW做事器处于同一个进程中, 效率要显著高于CGI。(由于微软的排他性, 只能运行于windows环境)
PHP作为Apache模块, Apache做事器在系统启动后, 预师长西席成多个进程副本驻留在内存中, 一旦有要求涌现, 就立即利用这些空余的子进程进行处理, 这样就不存在天生子进程造成的延迟了。
这些做事器副本在处理完一次HTTP要求之后并不立即退出, 而是勾留在打算机中等待下次要求。对付客户浏览器的要求反应更快, 性能较高。
实例: 实行操持任务的脚本(CLI模式的判断)
<?phpheader("Content-Type: text/html; charset=UTF-8");function http_gets($url){ $oCurl = curl_init(); if(stripos($url,"https://")!==FALSE){ curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1 } curl_setopt($oCurl, CURLOPT_URL, $url); curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1); $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); if(intval($aStatus["http_code"])==200){ return true; }else{ return false; }}if(PHP_SAPI == 'cli'){ $domain="47.74.157.205"; $queues = array( 'Admin/Login/queue', 'Home/Queue/tendency', 'Home/Queue/houprice', 'Home/Queue/paicuo', 'Home/Queue/qianbao', 'Home/Queue/move', 'Home/Queue/yichang', );$fp = fopen("/data/thyjy/lockrun.txt", "w+");if(flock($fp,LOCK_EX | LOCK_NB)){ for($i=0;$i<count($queues);$i++){ http_gets("http://".$domain."/".$queues[$i]); } flock($fp,LOCK_UN); } fclose($fp); echo "本次实行完毕";}?>