# 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,非线程安全)的版本能够更好的提高效率。
- 前言
- Interview
- 01-cookie与session
- 04-mysql索引
- 05-memcache与redis
- 06-高并发
- 07-主从同步
- 08-myisam与inondb
- 09-框架区别
- 10-php7新特性
- 11-设计模式
- 12-MySQL优化
- 13-php自动加载机制
- 14-MongoDB命令
- 15-Python爬虫之scrapy框架
- 16-php运行原理
- 17-单点登录
- Linux
- linux常见命令
- awk
- sed
- bash-shell
- vim学习教程
- PHP
- php运行机制
- php执行效率
- word2pdf
- php预览Word
- wechat_wafter2
- Python
- python
- win-bat
- svn操作命令
- git常用操作命令
- git_install
- gitlab安装
- nextcloud
- docker