🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# php运行方式以及,让Apache中的PHP以fpm方式运行 一直用的都是别人编译好的,deb或者rpm包或者lnmp一键安装包,为了弄清楚PHP的运行方式,自己来编译安装下~加深对CGI,fastcgi,php-fpm的理解~也说说遇到的问题~ # PHP的运行方式 |server|方式|注释| |---|--|---| |IIS | isAPI | 接口方式| |Apache | Apache2handle | 将PHP编译为Apache的内置模块,LoadModule php7_module modules/libphp7.so | |Nginx | php-fpm | fastcgi转发给php-fpm处理,当然也可以转发给Apache处理 | |命令行 | php-cli | 终端或命令行中,直接`php 文件`运行,不需要server | IIS因为用的不多,没有过多的去看,也就不说了~ Apache一般情况下是把PHP当做自己的模块去处理,当然也可以用php-fpm的方式,之后会说到~ nginx则普遍会使用php-fpm方式,即用户浏览一个页面,当nginx配置的server中正则匹配到PHP文件,会由fastcgi将访问信息转发给php-fpm处理,具体转发是转发到127.0.0.1:9000端口处理,或者php-cgi.sock处理 命令行,采用PHP自带的php-cli方式运行。 用`netstat -anplt`即可看到9000端口被监听,如果看不到,则说明你的PHP是以sock方式运行,转发那里一般写的大概是:unix://tmp/php-cgi.sock,可以在/tmp看到那个文件。 # 怎么让Apache中的PHP以php-fpm方式运行 ## 编译安装思路,过程 1. ./configure 配置 (mysql比较特殊,使用cmake) 2. make编译 3. make install安装 ## 遇到错误 1. 配置错误,检查修改 2. 编译错误,使用`make clean`清理掉已编译的内容,然后修改后,重新编译 3. 如果缺少某个模块或者依赖,去网上下载安装,然后继续 ```bash #一般apache模块编译方式 ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache/bin/apxs --with-config-file-path=/usr/local/php/etc --with-config-file-scan-dir=/usr/local/php/conf.d --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-mysqlnd --with-gd --enable-gd-native-ttf --with-iconv=/usr/local/libiconv --with-freetype-dir=/usr/local/freetype --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --with-gettext make ZEND_EXTRA_LIBS='-liconv' make install #然后在httpd.conf里面载入模块php5.so文件 #fpm编译方式 ./configure --prefix=/usr/local/php --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-config-file-path=/usr/local/php/etc --with-config-file-scan-dir=/usr/local/php/conf.d --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-mysqlnd --with-gd --enable-gd-native-ttf --with-iconv=/usr/local/libiconv --with-freetype-dir=/usr/local/freetype --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --with-gettext make make install ``` 主要差异如下: ```bash php for nginx : --enable-fpm --with-fpm-user=www --with-fpm-group=www php for apache: --with-apxs2=/usr/local/apache/bin/apxs ``` nginx开启了fpm,apache加载了apxs2,那么能不能Apache也用fpm形式? 答:可以。 1. 使用fpm方式编译PHP,然后修改httpd.conf文件 2. 开启proxy相关的模块 3. 注释:#LoadModule php7_module modules/libphp7.so 4. 在文件末尾新增匹配转发 ```bash <FilesMatch \.php$> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch> ``` 配置完毕,重启下php-fpm,然后查看phpinfo即可看到执行方式变为fpm了 # 安装nginx,并做相关配置,监听88端口,这样Apache与nginx互不干涉,可以同时存在 ```bash server { listen 88; server_name www.test.com; location / { root /home/wwwroot/test; index index.html index.php; } location ~ \.php(.*)$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; set $file_root /home/wwwroot/test fastcgi_param SCRIPT_FILENAME $file_root$fastcgi_script_name; include fastcgi_params; } } #增加pathinfo信息,访问www.test.com:88/index.php/a/b/c 和index.php一个效果 server { listen 88; server_name www.test.com; location / { root /home/wwwroot/test; index index.html index.php; } location ~ \.php(.*)$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; set $fileroot /home/wwwroot/test; set $path_info ""; set $real_script_name $fastcgi_script_name; if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") { set $real_script_name $1; set $path_info $2; } fastcgi_param PATH_INFO $path_info; fastcgi_param SCRIPT_NAME $real_script_name; fastcgi_param SCRIPT_FILENAME $fileroot/$real_script_name; fastcgi_param SCRIPT_FILENAME $fileroot/$fastcgi_script_name; include fastcgi_params; } } ``` # php-fpm相关命令 /usr/local/php/sbin/php-fpm //启动 kill -INT `cat /usr/local/php/var/run/php-fpm.pid` //关闭 kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid` //重启 # nginx启动信息 /usr/local/nginx/sbin/nginx //启动 /usr/local/nginx/sbin/nginx -t //检测配置 /usr/local/nginx/sbin/nginx -s stop //停止 /usr/local/nginx/sbin/nginx -s reload //重载 # 附录 PHP的线程安全与非线程安全版本的区别 > http://www.cnblogs.com/blosaa/archive/2013/01/09/2852319.html > Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍。 > 从2000年 10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的版本,这是由于与Linux/Unix系统是采用多进程的工作方式不 同的是Windows系统是采用多线程的工作方式。如果在IIS下以CGI方式运行PHP会非常慢,这是由于CGI模式是建立在多进程的基础之上的,而非 多线程。一般我们会把PHP配置成以ISAPI的方式来运行,ISAPI是多线程的方式,这样就快多了。但存在一个问题,很多常用的PHP扩展是以 Linux/Unix的多进程思想来开发的,这些扩展在ISAPI的方式运行时就会出错搞垮IIS。因此在IIS下CGI模式才是PHP运行的最安全方 式,但CGI模式对于每个HTTP请求都需要重新加载和卸载整个PHP环境,其消耗是巨大的。 > 为了兼顾IIS下PHP的效率和安全,微软 给出了FastCGI的解决方案。FastCGI可以让PHP的进程重复利用而不是每一个新的请求就重开一个进程。同时FastCGI也可以允许几个进程 同时执行。这样既解决了CGI进程模式消耗太大的问题,又利用上了CGI进程模式不存在线程安全问题的优势。 > 因此,如果是使用ISAPI 的方式来运行PHP就必须用Thread Safe(线程安全)的版本;而用FastCGI模式运行PHP的话就没有必要用线程安全检查了,用None Thread Safe(NTS,非线程安全)的版本能够更好的提高效率。