php監控進程
Ⅰ 如何用supervisor守護php-fpm主進程以實現php-fpm的自動重啟
1. 安裝supervisor
supervisor本身是python實現的,而且是調研階段,故先創建一個新的virtualenv環境,然後用pip安裝好supervisor包。
至此,基本的調研環境搭建完畢。當然,php-fpm和PHP環境以及前端的Nginx是早就ready的。
2. 分析php-fpm.sh腳本
通常編譯安裝PHP後,php-fpm這個2進制的C程序也會被編譯並安裝好,典型路徑在php_install_path/sbin/目錄下。該
目錄下還有個名為php-fpm.sh的腳本用於控制php-fpm進程的start/stop/restart/reload等動作。
./sbin/php-fpm.sh腳本中,」start」操作啟動了php-fpm主進程,其餘的操作都是通過向php-fpm master進程發signal實現的。
<code class="hljs bash">## code segment in php-fpm.sh
case "$1" in
start)
echo -n "Starting php-fpm "
## 下面這行是關鍵命令
$php_fpm_BIN --daemonize $php_opts
if [ "$?" != 0 ] ; then
echo " failed"
exit 1
fi
wait_for_pid created $php_fpm_PID
if [ -n "$try" ] ; then
echo " failed"
exit 1
else
echo " done"
fi
;;</code>
從上面是終端輸入」./sbin/php-fpm.sh
start」時,實際執行的代碼,可以看到,php-fpm進程的啟動參數是–daemonize
$php_opts,而$php_opts的值為」–fpm-config $php_fpm_CONF –pid $php_fpm_PID」。
注意: php-fpm.sh啟動php-fpm master進程時,傳入了daemonize參數,表明php-fpm master process以守護(daemon)方式啟動,而根據supervisor文檔的說明,當用supervisor監護進程時,被監護進程不能是守護進程,這是由於守護進程通常會在fork完子進程後就讓父進程」結束生命」,也即由supervisor創建的父進程退出,此時,supervisor無法再監護已退出進程創建出來的子進程。關於daemon process的行為,可以參考linux Daemon Writing HOWTO一文來理解。
根據上面的分析,我們知道,只要supervisor啟動php-fpm進程時,不傳入daemonize參數即可。
3. 實現php-fpm主進程守護功能的supervisor配置文件
上面的分析已經告訴我們應該怎麼解決問題了,下面直接上驗證可用的配置文件。文件位於php-fpm.conf同級目錄下(典型路徑為php_install_path/etc/)。
<code class="hljs bash"><code class="hljs vhdl">
[inet_http_server] ; inet (TCP) server disabled by default
port=127.0.0.1:9015 ; (ip_address:port specifier, *:port for all iface)
[supervisord]
logfile=./var/log/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=2 ; (num of main logfile rotation backups;default 10)
loglevel=info ; (log level;default info; others: debug,warn,trace)
pidfile=./var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false ; (start in foreground if true;default false)
minfds=1024 ; (min. avail startup file descriptors;default 1024)
minprocs=200 ; (min. avail process descriptors;default 200)
identifier=sup.php-fpm ; (supervisord identifier, default is 'supervisor')
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=http://127.0.0.1:9015 ; use an http:// url to specify an inet socket
[program:php-fpm]
command=bash -c "sleep 1 && /home/slvher/tools/php/5.6.11/sbin/php-fpm --fpm-config /home/slvher/tools/php/5.6.11/etc/php-fpm.conf --pid /home/slvher/tools/php/5.6.11/var/run/php-fpm.pid" ; the program (relative uses PATH, can take args)
process_name=%(program_name)s ; process_name expr (default %(program_name)s)
autostart=true ; start at supervisord start (default: true)
autorestart=true ; whether/when to restart (default: unexpected)
startretries=5 ; max # of serial start failures (default 3)
exitcodes=0,2,70 ; 'expected' exit codes for process (default 0,2)
stopsignal=QUIT ; signal used to kill process (default TERM)
stopwaitsecs=2 ; max num secs to wait b4 SIGKILL (default 10)
</code></code>
配置文件結構通過查看supervisor文檔很容易就能掌握,有兩個配置項需要特別注意:
1) command
它指定了supervisor要監控的進程的啟動命令,可以看到,這里我們沒有給php-fpm傳入daemonize參數,其餘參數只是展開了php-fpm.sh中的shell變數而已。
大家已經注意到,command也不是直接調起php-fpm,而是通過bash -c執行了兩個命令,而第一個命令是sleep 1。這是由於php-fpm在stop後,其佔用的埠通常不能立即釋放,此時,supervisor以極快的速度試圖重新拉起進程時,可能會由於報如下錯誤而導致幾次retry均失敗:
<code class="hljs bash"><code class="hljs vhdl"><code class="hljs vbscript">## var/log/php-fpm.error.log
[18-Jul-2015 21:35:28] ERROR: unable to bind listening socket for address '127.0.0.1:9002': Address already in use (98)
[18-Jul-2015 21:35:28] ERROR: FPM initialization failed</code></code></code>
而supervisor目前還不支持delay restart功能,因此,這里只能通過先sleep再啟動的略顯tricky的方法來解決問題,結果表明,療效不錯且無副作用。-_-
2) autorestart
其文檔描述如下:
<code class="hljs bash"><code class="hljs vhdl"><code class="hljs vbscript"><code class="hljs livecodeserver">May be one of false, unexpected, or true. If false, the process will never be autorestarted. If unexpected, the process will be restart when the program exits with an exit code that is not one of the exit codes associated with this process』 configuration (see exitcodes). If true, the process will be unconditionally restarted when it exits, without regard to its exit code.</code></code></code></code>
其默認值是unexpected,表示若被監護進程的exit code異常時,supervisor才會重新拉起進程。這里設置為true,表明任何時候進程退出均會被再次拉起。
這樣配置好後,在本文第1步搭建好的virtualenv環境中,運行如下命令即可完成supervisor對php-fpm master進程的監護:
<code class="hljs bash"><code class="hljs vhdl"><code class="hljs vbscript"><code class="hljs livecodeserver"><code class="hljs avrasm">shell> supervisord -c etc/sup.php-fpm.conf</code></code></code></code></code>
然後,通過ps x | fgrep fpm可以看到,php-fpm主進程已經被拉起了。
然後,kill掉php-fpm主進程,再次ps x | fgrep fpm可以看到,一個新的php-fpm主進程會被supervisor創建出來。
至此,用supervisor守護php-fpm主進程以實現php-fpm的自動重啟的需求已經解決了。
Ⅱ PHP涓鐨凢PM鏄鍋氫粈涔堢殑
FPM錛團astCGI 榪涚▼綆$悊鍣錛夌敤浜庢浛鎹 PHP FastCGI 鐨勫ぇ閮ㄥ垎闄勫姞鍔熻兘錛屽逛簬楂樿礋杞界綉絝欐槸闈炲父鏈夌敤鐨勩傚畠鐨勫姛鑳藉寘鎷錛
鏀鎸佸鉤婊戝仠姝/鍚鍔ㄧ殑楂樼駭榪涚▼綆$悊鍔熻兘錛
鍙浠ュ伐浣滀簬涓嶅悓鐨 uid/gid/chroot 鐜澧冧笅錛屽苟鐩戝惉涓嶅悓鐨勭鍙e拰浣跨敤涓嶅悓鐨 php.ini 閰嶇疆鏂囦歡錛堝彲鍙栦唬 safe_mode 鐨勮劇疆錛夛紱
stdout 鍜 stderr 鏃ュ織璁板綍;
鍦ㄥ彂鐢熸剰澶栨儏鍐電殑鏃跺欒兘澶熼噸鏂板惎鍔ㄥ苟緙撳瓨琚鐮村潖鐨 opcode;
鏂囦歡涓婁紶浼樺寲鏀鎸;
"鎱㈡棩蹇" - 璁板綍鑴氭湰錛堜笉浠呰板綍鏂囦歡鍚嶏紝榪樿板綍 PHP backtrace 淇℃伅錛屽彲浠ヤ嬌鐢 ptrace鎴栬呯被浼煎伐鍏瘋誨彇鍜屽垎鏋愯繙紼嬭繘紼嬬殑榪愯屾暟鎹錛夎繍琛屾墍瀵艱嚧鐨勫紓甯哥紦鎱;
fastcgi_finish_request() - 鐗規畩鍔熻兘錛氱敤浜庡湪璇鋒眰瀹屾垚鍜屽埛鏂版暟鎹鍚庯紝緇х畫鍦ㄥ悗鍙版墽琛岃楁椂鐨勫伐浣滐紙褰曞叆瑙嗛戣漿鎹銆佺粺璁″勭悊絳夛級錛
鍔ㄦ侊紡闈欐佸瓙榪涚▼浜х敓錛
鍩烘湰 SAPI 榪愯岀姸鎬佷俊鎮錛堢被浼糀pache鐨 mod_status錛夛紱
鍩轟簬 php.ini 鐨勯厤緗鏂囦歡銆
Ⅲ 如何查看一個正在運行的php-fpm進程使用的php命令地址
使用netstat-napo|grep"php-fpm"|wc-l查看一下當前fastcgi進程個數,如果個數接近conf里配置的上限,就需要調高進程數。
Ⅳ php 中如何獲取當前系統的進程列表,不是簡單的執行shell語句
$arrya = array();
用exec("linux 命令",$array)
如果查看進程的話 會把所有的信息返回給$array數組里 你直接輸出就可以了
Ⅳ 如何看php-fpm 進程數量是否足夠
首先,需要預估項目在生產環境能有多少並發產生,根據預估設置初始fpm進程數配置,具體可以參考PHP文檔
http://php.net/manual/zh/install.fpm.configuration.php
對於FPM的監控
建議開啟php-fpm.conf中pm.status_path設置,可以通過url請求獲取當前時刻fpm的進程狀態,支持html,josn,xml等數據格式返回,結合定時任務,可以做成一個fpm狀態監控,通過url獲取的數據中,'listen queue' 表示請求等待隊列,這個參數如果不為0,就表示當前進程數被使用完了,新的請求過來必須進入等待隊列,所以,通過這個參數,就可以判斷是否應該增加進程數或加強伺服器配置
Ⅵ Php cli是守護進程的嗎
php_cli模式簡介
php-cli是php Command Line Interface的簡稱,如同它名字的意思,就是php在命令行運行的介面,區別於在Web伺服器上運行的php環境(php-cgi, isapi等) 也就是說,php不單可以寫前台網頁,它還可以用來寫後台的程序。 PHP的CLI shell腳本適用於所有的PHP優勢,使創建要麼支持腳本或系統甚至與GUI應用程序的服務端!——註:windows和linux下都支持php_cli模式
PHP-cli應用場景:
1.多線程應用
這方面的好處,引用鳥哥的話:
優點:
1. 使用多進程, 子進程結束以後, 內核會負責回收資源
2. 使用多進程,子進程異常退出不會導致整個進程Thread退出. 父進程還有機會重建流程.
3. 一個常駐主進程, 只負責任務分發, 邏輯更清楚.
php的多線程—沒錯就是php多線程應用,雖然大家都普遍認為php沒有多線程(curl屬於模擬多線程而不是真實的),但是在php_cli模式下的php徹底的是屬於多線程。這個時候php屬於linux的一個守護進程。 在本人之前寫過的《PHP多線程批量採集下載美女圖片(續)》的時候在採集程序里雖然使用curl來模擬多線程,但是在瀏覽器執行的時候也是會遇到執行超時或內存abort而導致程序中斷,(要嘗試幾次才可以徹底成功),但是如果在php-cli模式下執行,你就會發現這個程序執行的很快,php多線程執行的優勢被徹底表現出來了.
備注:這種多線程方式不是很成熟,不適合大規模的生成應用,偶爾使用還是可以的
2.定時執行php程序
利用linux的cron方式,那麼這個方式是如何定時執行php程序?請看下文
3.開發桌面程序
你可以做您的Windows或Linux中使用PHP的圖形用戶界面(GUI)應用!所有你需要的是PHP的命令行介面和一包GTK。這將允許建立真正的攜帶型圖形用戶界面應用程序(呵呵,之前只是知道php可以做桌面程序,現在才知道是使用php_cli模式),並且不需要學習別的。
4.編寫PHP的shell腳本
如果你不會bash shell或者Perl等的使用,但是你又需要一些腳本去執行的時候,怎麼辦?這個時候你完全可以使用你熟悉的php編寫shell腳本,這個時候你是不是突然感覺PHP是不是太強大了!—–真正做到一種語言,到處開發!
PHP_CLI使用方法
win下面的執行方法:
假設php.exe 在D:xamppphp在dos命令在可以這個執行:
復制代碼 代碼如下:D:xamppphpphp.exe D:xampphtdocstest.php
就可以執行test.php這個文件了 。這里推薦win平台下xampp集成環境,真正比wamp強大N倍,這個集成包可以直接進入dos模式。
linux下php_cli使用
首先找到你安裝php的路徑,以我為例:
當然實現的方法不止一個,大家可以嘗試其他方法實現!
例外關於php的cli還有很多參數可以加入:具體可以參考:http://php.net/manual/en/features.commandline.php
關於定時執行
cron是一個linux下的定時執行工具,可以在無需人工干預的情況下運行作業,周期性作業,比如備份數據 打開/etc/crontab,添加:
復制代碼 代碼如下:
/usr/bin/php -f /data/htdocs/test.php
Ⅶ php 後台怎麼開一個進程監聽Redis的隊列消息呢用while
redis的subscribe用pconnect鏈接,執行這個腳本的進程會自動監聽所訂閱的頻道發送的消息
ini_set(『default_socket_timeout』, -1);
$redis = new \Redis();
$redis->pconnect('127.0.0.1', 6379);
//訂閱
$redis->subscribe(['msg'], 'callfun');
function callfun($redis, $channel, $msg)
{
var_mp([
'redis' => $redis,
'channel' => $channel,
'msg' => $msg
]);
}