# 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