Shell腳本實現(xiàn)啟動PHP內(nèi)置FastCGI Server
前幾天把工作平臺從 Ubuntu 9.10 Karmic 更新到了 10.04 Lucid,由于 Lucid 官方源自帶了 PHP5.3.2,以前使用的 dotdeb 的源就沒法用了,一直很喜歡這個源的,不但提供了 PHP5.3 而且還有 php5-fpm 這個很實用的 fcgi 進(jìn)程管理器,這個在官方源里面是沒有的。強(qiáng)行上了 dotdeb 雖然也可以,不過必然有很多包會出現(xiàn)依賴問題,處理這些依賴關(guān)系是件很煩心的事情。哥啥都不怕,就怕麻煩~ :!:
對于 PHP 來說,php-fpm 還是最合適的,spawn-fcgi 這類東西就不用考慮了,我寧愿用 PHP5 內(nèi)置的 FastCGI Server。
通過下面的命令啟動服務(wù)器,監(jiān)聽 9000 端口:
php-cgi -q -b 127.0.0.1:9000 &
好了,配合 nginx,可以繼續(xù)開始工作了,但是你會發(fā)現(xiàn)每隔一段時間就會出現(xiàn) 502 Bad Gateway 錯誤,因為 php-cgi 進(jìn)程處理的請求數(shù)達(dá)到最大(默認(rèn)500)自動退出了。
你需要設(shè)置兩個環(huán)境變量:
PHP_FCGI_CHILDREN – 派生子進(jìn)程的數(shù)量
PHP_FCGI_MAX_REQUESTS – 每個子進(jìn)程所能處理的最大請求數(shù)
配合這兩個環(huán)境變量,啟動內(nèi)置的 FastCGI Server,保證 PHP 能夠派生出子進(jìn)程來負(fù)責(zé)處理請求,而不是由主進(jìn)程來做。否則就會出現(xiàn)上面說的情況,達(dá)到 500 以后,自動退出。
下面是一個簡單的腳本:
#!/bin/bash
## 參考:
##
## http://php.net/manual/en/install.unix.lighttpd-14.php
## http://kovyrin.net/2006/05/30/nginx-php-fastcgi-howto
##
## php-cgi 的文件路徑
PHPFCGI=`which php-cgi`
## PID 文件路徑
PHP_PID="/tmp/php.pid"
## 綁定 TCP 地址
FCGI_BIND_ADDRESS="127.0.0.1:9000"
## 綁定到 Unix domain socket
#FCGI_BIND_ADDRESS="/tmp/php.sock"
## 派生出多少個 PHP 子進(jìn)程
## 其中不包括主進(jìn)程
PHP_FCGI_CHILDREN=16
## 每個 PHP 進(jìn)程處理的最大請求數(shù)
PHP_FCGI_MAX_REQUESTS=4096
## 用戶
USERID=verdana
################## no config below this line
# 根據(jù)用戶不同,切換啟動命令
if test x$UID = x0; then
CMD="/bin/su -m -c \"$PHPFCGI -q -b $FCGI_BIND_ADDRESS\" $USERID"
else
CMD="$PHPFCGI -b $FCGI_BIND_ADDRESS"
fi
echo $CMD
# 相關(guān)的環(huán)境變量
E="PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS"
# 忽略其他的環(huán)境變量,以一個干凈的環(huán)境啟動
nohup env - $E sh -c "$CMD" &> /dev/null &
# 記錄 PHP 主進(jìn)程的 PID
# $! 返回的是 sh 的 PID
# 找到所有 php-cgi 進(jìn)程中最小的 PID,就是主進(jìn)程的 PID
MASTER_PID=`ps -e | grep 'php-cgi' | sed -n '1p' | awk '{print $1}'`
echo $MASTER_PID > "$PHP_PID"
如何關(guān)閉呢?
可以一次性殺滅所有的 php-cgi 進(jìn)程:
ps -e | grep php-cgi | awk '{print $1}' | xargs kill
只弄死主進(jìn)程也可以達(dá)到相同的效果,所有子進(jìn)程也會隨之消失:
cat /tmp/php.pid | xargs kill
- PHP+shell實現(xiàn)多線程的方法
- php-fpm開機(jī)自動啟動Shell腳本
- Shell、Perl、Python、PHP訪問 MySQL 數(shù)據(jù)庫代碼實例
- Shell腳本中實現(xiàn)更新PHP5
- PHP和Shell實現(xiàn)檢查SAMBA與NFS Server是否存在
- Ruby、PHP、Shell實現(xiàn)求50以內(nèi)的素數(shù)
- shell腳本聯(lián)合PHP腳本采集網(wǎng)站的pv和alexa排名
- php管理nginx虛擬主機(jī)shell腳本實例
- 監(jiān)控服務(wù)器swap并重啟php的Shell腳本
- PHP+shell腳本操作Memcached和Apache Status的實例分享
相關(guān)文章
Shell腳本實現(xiàn)apache日志中的狀態(tài)碼分析
這篇文章主要介紹了Shell腳本實現(xiàn)apache日志中的狀態(tài)碼分析,本文先是介紹了按天切割日志的方法,然后給出了分析訪問狀態(tài)碼的腳本,需要的朋友可以參考下2014-12-12詳解shell 遍歷文件夾內(nèi)所有文件并打印絕對路徑
本篇文章主要介紹了shell 遍歷文件夾內(nèi)所有文件并打印絕對路徑,具有一定的參考價值,有興趣的可以了解一下。2017-01-01Formatting Long Lines 格式化多行字符的shell腳本
這篇文章主要介紹了Formatting Long Lines 格式化多行字符的shell腳本,需要的朋友可以參考下2016-08-08Linux 下xargs命令詳解及xargs與管道的區(qū)別
在工作中經(jīng)常會接觸到xargs命令,特別是在別人寫的腳本里面也經(jīng)常會遇到,但是卻很容易與管道搞混淆,本篇會詳細(xì)講解到底什么是xargs命令,為什么要用xargs命令以及與管道的區(qū)別,本文通過實例給大家詳解,需要的的朋友參考下2017-04-04