关于swoole和php-fpm的一些问题

我们知道,swoole之所以高效和支撑高并发,是因为它在php启动的五个步骤中的minit之后开始接管了php,然后swoole可以自己创建worker进程来处理外界请求。我们知道,在没有swoole的时候,是php-fpm来管理着php的进程。以nginx和php交互为例:
客户端发来一个请求给nginx,然后nginx将请求转发给监听9000端口的php。这时候php的进程管理器php-fpm(master进程)开始接收请求,然后将请求下发给下面的woker子进程来处理。
那php-fpm是什么时候开始启动的呢?
PHP-FPM
PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,可以在 http://php-fpm.org/download下载得到。
PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。
现在我们可以在最新的PHP 5.3.2的源码树里下载得到直接整合了PHP-FPM的分支,据说下个版本会融合进PHP的主分支去。相对Spawn-FCGI,PHP-FPM在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab进行监控,而PHP-FPM则没有这种烦恼。
PHP5.3.3已经集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多有点,所以被PHP官方收录了。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM。
上面是php-fpm的一些官方介绍。就是说,我们在编译安装php的时候,如果在./configure的时候带 –enable-fpm参数则安装php-fpm功能,然后我们那时候不是有个设置php开机启动的操作么,php-fpm就是这个时候开始启动的。
在php的官方文档中有这么一句话:
也就是说,swoole的运行时独立于php-fpm的,只要在cli模式下就可以运行swoole。我之前一直很混淆:cli模式只知道是在linux的命令行下执行php,但具体是什么样的并不了解。而且,一直以为php是要启动之后才能在命令行下通过 php XXX.php来执行的。后来搜了下php cli运行原理才彻底搞明白,如下:
php官方文档说明:
从版本 4.3.0 开始,PHP 提供了一种新类型的 CLI SAPI(Server Application Programming Interface,服务端应用编程端口)支持,名为 CLI,意为Command Line Interface,即命令行接口。顾名思义,该 CLI SAPI 模块主要用作 PHP 的开发外壳应用。CLI SAPI 和其它 CLI SAPI 模块相比有很多的不同之处,我们将在本章中详细阐述。值得一提的是,CLI 和 CGI 是不同的 SAPI,尽管它们之间有很多共同的行为。
CLI SAPI 最先是随 PHP 4.2.0 版本发布的,但仍旧只是一个实验性的版本,并需要在运行 ./configure 时加上 –enable-cli 参数。从 PHP 4.3.0 版本开始,CLI SAPI 成为了正式模块,–enable-cli 参数会被默认得设置为 on,也可以用参数 –disable-cli 来屏蔽。
从 PHP 4.3.0开始,CLI/CGI 二进制执行文件的文件名、位置和是否存在会根据 PHP 在系统上的安装而不同。在默认情况下,当运行 make 时,CGI 和 CLI 都会被编译并且分别放置在 PHP 源文件目录的 sapi/cgi/php 和 sapi/cli/php 下。可以注意到两个文件都被命名为了 php。在 make install的过程中会发生什么取决于配置行。如果在配置的时候选择了一个 SAPI 模块,如 apxs,或者使用了 –disable-cgi 参数,则在 make install 的过程中,CLI 将被拷贝到 {PREFIX}/bin/php,除非 CGI 已经被放置在了那个位置。因此,例如,如果在配置行中有 –with–apxs ,则在 make install的过程中,CLI 将被拷贝到 {PREFIX}/bin/php。如果希望撤销 CGI 执行文件的安装,请在 make install 之后运行 make install-cli。或者,也可以在配置行中加上 –disable-cgi 参数。
Note:
由于 –enable-cli 和 –enable-cgi 同时默认有效,因此,不必再配置行中加上 –enable-cli 来使得 CLI 在 make install 过程中被拷贝到{PREFIX}/bin/php。
在 PHP 4.2.0 到 PHP 4.2.3 之间的 Windows 发行包中,CLI 的文件名为 php-cli.exe,相同文件夹下的 php.exe 为 CGI。从 PHP 4.3.0 版本开始,Windows 的发行包中 CLI 的执行文件为 php.exe,被放置在一个单独的名为 cli 的文件夹下,即 cli/php.exe。在 PHP 5 中,CLI 存在于主文件夹中,名为 php.exe,而 CGI 版本名为 php-cgi.exe。
从 PHP 5 起,一个名为 php-win.exe 的新文件随包发布。它相当于 CLI 版本,但是 php-win 不输出任何内容,便不提供控制台(不会弹出“DOS 窗口”)。这种方式类似于 php-gtk。需要使用 –enable-cli-win32 选项来配置它。
Note: 如何得知自己使用的是哪个 SAPI?
在命令行下,运行 php -v 便能得知该 php 是 CGI 还是 CLI。请参考函数 php_sapi_name() 以及常量 PHP_SAPI。
通过上面的文档可以知道,在php5以上的版本中,php在cli下的文件名为cli/php.exe.在windows下,xx.exe文件表示是可执行文件,也即是说不用启动php,需要用到它的时候才运行php.exe文件。在命令行下,比方我们执行
#php test.php
那它执行的原理是什么呢?还记不记得我们在linux执行一个未知命令的时候,会报出该命令不存在?同样道理,我们可以理解成操作系统已经安装了php这个命令,当执行到php test.php的时候,操作系统会自动把test.php文件找到php.exe并交给它去执行。
通过对上面的理解,我们就很好理解为什么用swoole的时候不需要php-fpm了,因为压根级不需要启动php-fpm.

发表评论

电子邮件地址不会被公开。 必填项已用*标注