一、概念解析CGI、FastCGI、PHP-CGI与php-fpm
CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,(比如Nginx和PHP)其程序须运行在网络服务器上。CGI可以使用多种语言编写,只要这种语言具有标准输入、输出和环境变量。如php,perl,tcl等
FastCGI像是一个常驻(long-live)型的CGI,主要行为是管理调度CGI解释器进程并将其保持在内存中,因此获得良好的性能、伸缩性、Fail- Over特性等等。它还支持分布式的运算,即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。
FastCGI的工作原理
1、Web Server启动时载入FastCGI进程管理器
2、FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接
3、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器,Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi(因为我们运行的是PHP代码,所以是php-cgi解释器进程)
4、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server,一次请求连接完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。而在CGI模式下,cgi完成一次请求即结束进程。
注:显然FastCGI进程在内存中管理着CGI子线程,这种工作模式是比较占用系统内存资源的!但是极大的提高了web server和系统程序的交互效率。
PHP-CGI是PHP自带的CGI,提供web server和php交互的功能,具体说就是提供web server基于php环境解析处理php代码的功能。
PHP-FPM是一个PHP FastCGI管理器,只能用于管理php-cgi子进程。php5.3.3之后的版本中已经集成为一个php扩展,在编译安装php时启用即可,而之前的版本中需要单独下载php-cgi源码。
二、源码编译的方式安装PHP与php-fpm(版本>php5.3.3)
第一步、下载php源码
可以使用wget命令获取,注意下载地址是有变动的,也可以直接在php的官网http://www.php.net/下载。
第二步、解压源代码
使用tar xzvf命令解压压缩包
第三步、编译安装
首先,进入源码解压文件;然后使用如下命令安装
./configure --prefix=/安装路径
--with-config-file-path=/配置文件路径
--enable-fpm
make&&make install
注:第一行配置了php的安装路径,后面如果要卸载php,则进入该路径下使用make clean命令并删除该文件目录。第二行配置文件路径,即php.ini等配置文件在该文件路径下。第三行启用了php-fpm扩展(这里换行只是为了方便展示说明,实际配置过程中请不要换行,用空格隔开各个参数即可)。在安装过程中可能会出现一些库的依赖问题,可以根据实际情况查找解决方案,ubuntu下一般都是使用apt-get install命令安装缺失的依赖库。
我们注意到,上述php源码编译安装的配置项非常简单,很多扩展都没有安装,比如说mysql、mysqli。可以在编译安装的时候启用更多扩展,前文的编译命令中就启用了php-fpm扩展,也可以在php安装完成后使用phpize工具单独编译安装php扩展。
推荐的编译参数:
./configure --prefix=/usr/local/php
--with-config-file-path=/usr/local/php/etc --with-config-file-scan-dir=/usr/local/php/etc/conf.d
--enable-fpm
--with-fpm-user=www
--with-fpm-group=www
--with-pear
--with-curl
--with-gd
--with-jpeg-dir
--with-png-dir
--with-freetype-dir
--with-iconv
--with-mcrypt
--with-mhash
--with-zlib
--with-xmlrpc
--with-xsl
--with-openssl
--with-mysql
--with-mysqli
--with-pdo-mysql
--disable-debug
--enable-zip
--enable-sockets
--enable-soap
--enable-mbstring
--enable-magic-quotes
--enable-inline-optimization
--enable-memory-limit
--enable-xml
--enable-ftp
--enable-exif
--enable-wddx
--enable-bcmath
--enable-calendar
--enable-sqlite-utf8
--enable-shmop
--enable-dba
--enable-sysvsem
--enable-sysvshm
--enable-sysvmsg
make && make install
至此,php就编译安装完成,但是我们的工作并没有完成。可以发现路径:/usr/local/php/etc下并没有php.ini文件,编译安装php是需要从源码目录中把编译过程中生成的php.ini文件(实际生成php.ini-development和php.ini-production 这两个php.ini文件,显然前者是开发环境使用而后者是生产环境使用)拷贝至我们在添加编译参数的时候规定的php配置文件路径。参考如下命令:
cp /源码路径/php.ini-production /usr/local/php/etc/php.ini
最后,为了能方便的在命令行下直接调用php命令,还需要将PHP的可执行目录添加到环境变量中。使用打开~/.bashrc,在末尾添加如下内容:
export PATH=/usr/local/php/bin:$PATH export PATH=/usr/local/php/sbin:$PATH
保存后,运行终端命令:
运行一个php脚本代码为:
phpinfo()
?>
根据返回的内容判断php和相应是扩展是否安装成功!
编译安装好php,下一步就是配置php-fpm,配置文件php-fpm.conf在php编译安装时设置的配置文件路径下。
1、打开配置文件找到pid = run/php-fpm.pid并把这一行前面的注释符号删掉。
2、启动php-fpm
命令:php安装路径\sbin\php-fpm
注:a、默认是不能以root用户组root用户启动,强制启动可以使用带参数的命令php-fpm -R
b、php-fpm.conf初始默认以www用户组www用户启动,可修改为其他普通用户组的用户,也可以添加一个 www用户组www用户
发现会报错。
3、再次打开配置文件
找到pm.min_spare_servers = XX 去除注释;
找到pm.max_spare_servers = XX去处注释;
找到pm.start_servers = XX去处注释。
4、再次启动php-fpm,如果还有问题,copy错误内容上百度找解决办法。
三、使用phpize动态编译安装PHP扩展模块
例如安装mysql扩展
php的源码包在/usr/local/php-5.2.6
php安装目录是/usr/local/php
第一步,进入源码包中对应的mysql扩展文件夹
cd /usr/local/php-5.2.6/ext/mysql
第二步,在mysql扩展文件夹目录下启动phpize
/usr/local/php/bin/phpize
第三步,编译安装mysql扩展
./configure --with-php-config=/usr/local/php/bin/php-config
注:普通扩展直接./configure即可,也可以带上参数;如果生成基于数据库的扩展,需要加上参数运行:1,--with- php-config。2,"--with-具体的数据库参数".比如, --with-pgsql、--with-mysql
make && make install
第四步,将编译生成的mysql.so拷贝到php.ini文件中确定的extension_dir指向的路径,并在php.ini里增加一行extension=mysql.so
最后,记得重启php-fpm,最好也重启一下nginx。