1. php如何獲得系統進程號
<?php
/*
**查看WINDOWS系統進程列表,並查找指定進程是否存在
*/
$tasklist = $_SERVER["WINDIR"]."\system32\tasklist.exe"; //找到windows系統下tasklist的路徑
//print($tasklist); //列印tasklist的路徑
@exec($tasklist,$arr); //運行tasklist.exe,返回一個數組$arr
//print_r($arr); //列印數組
//用循環列印進程列表
foreach($arr as $value){
$list = explode(" ",$value);
print($list[0].'<br />');
//查找指定進程並列印
/* if('php.exe'==$list[0]){
echo $info[0].'<br />';
} */
}
?>
2. 如何在PHP里啟動一個進程以後讓它在後台運行
在LINUX/UNIX下:
WINNT的start命令比WIN9X的多很多選項。
3. 如何開啟伺服器php進程
apache開啟時會自動載入php到進程中(需要設置php5_mole),並載入了core, zendengine, extesion 3個模塊。
core是核心,處理各種請求,stream模式
zendengine是解釋器,用來執行用戶代碼
extension則是php的插件,比較常用的類似於mysqli, pdo
4. 如何關閉php-fpm進程
可以去/etc/init.d/目錄下看看有沒有php5.4-fpm或php7.0-fpm這種文件,如果有,可以用service php5.4-fpm stop這種方式停掉服務就可以了,如果還有不明白的話,你可以在後盾人看看視頻找找答案,有空多看看時間長了,慢慢就明白了,希望能幫到你,給個採納吧謝謝(ಡωಡ)hiahiahia
5. php如何開啟一個進程去關閉另一個進程
執行 ps 命令,看進程號,然後 kill 掉,或者讓另一個進程給這個進程號發送 SIGTERM 信號,這個進程就退出了
6. 如何看php-fpm 進程數量是否足夠
使用 netstat -napo |grep "php-fpm" | wc -l 查看一下當前fastcgi進程個數,如果個數接近conf里配置的上限,就需要調高進程數。
7. php在web上運行是多進程還是單進程
php在web上運行是單進程的,具體原因如下:
1、PHP是一個單線程的腳本開發語言,它常在Web開發及系統集成中出現。
PHP是單進程單線程的,當處理復雜的業務的時候我們會發現他串列執行命令的時候CPU、磁碟、內存等利用的都很低有很多時候都是在排隊等待,有的時候我們想並發的讓他去執行一批任務然後一起拿解決結果是一件很痛苦的事情(自己用pthread或者其他方式才能解決,但是這很痛苦)開發語言一直在升級變化適應需要。另外,可以考慮通訊使用Swoole。
2、解決方案如下:
分前後端,前端可以通過消息中間件,同步、非同步 調用一個或多個介面。但是socket的擴展確確實實不咋好用。不是普通小企業能做的出來的。
8. PHP 中怎樣終止單個進程
<?php
exec("kill-9pid,$op,$status);
?>
把結果逐行追加到$op的結尾處,只有指定了第二 個參數時,才可以用第三個參數,用來取得命令執行的狀態碼。$status 1 kill成功,0 是失敗(一般情況下是無此進程)。
我的實際項目中是在執行的開始通過getmypid()獲取進程id保存到資料庫,如果crontab再次觸發則把之前的進程kill掉再重新執行一遍以上代碼。
希望能幫到你。
9. 如何防止PHP進程異常退出
通常,在cli下運行的常駐後台PHP進程,可能異常退出,比如php執行過程中出現的致命錯誤,或被 kill 命令手動殺死等。如下面的php代碼:
while(1){
$content = fgets(STDIN);
if(empty($content)){
sleep(1);
}
//邏輯處理部分代碼省略
}
排查過程
我們使用register_shutdown_function來跟蹤下到底是什麼錯誤導致的進程退出。(想更多了解register_shutdown_function,請查看博文 妙用php中的register_shutdown_function和fastcgi_finish_request )加入了錯誤捕捉代碼。如下:
$is_end = false;
function catch_error(){
global $is_end;
$time = date('Y-m-d H:i:s');
$error = error_get_last();
$msg = "$time [error]";
if($is_end){
$msg .= "is_end[yes]";
}else{
$msg .= "is_end[no]";
}
if($error){
$msg .= var_export($error,1);
}
echo $msg."\r\n";
}
register_shutdown_function("catch_error");
可是,php進程再次退出。而在日誌中並沒有記錄任何信息。說明register_shutdown_function方法根本沒有執行。是什麼導致register_shutdown_function方法沒有運行呢?在php的官方文檔中又這樣一個注釋:
Shutdown functions will not be executed if the process is killed with a SIGTERM or SIGKILL signal. While you cannot intercept a SIGKILL, you can use pcntl_signal() to install a handler for a SIGTERM which uses exit() to end cleanly.
注釋的意思是當php進程獲得SIGTERM和SIGKILL信號而退出時,是不執行register_shutdown_function方法的。可以使用pcntl_signal()方法來捕獲信息,並調用相應的處理方法。
好,那是不是信號導致我們的php進程退出呢?我們加入如下代碼:
declare(ticks = 1);
function sig_handler($signo){
$time = date('Y-m-d H:i:s');
echo $time." exit signo[{$signo}]\r\n";
exit("");
}
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
pcntl_signal(SIGINT, "sig_handler");
pcntl_signal(SIGQUIT, "sig_handler");
pcntl_signal(SIGILL, "sig_handler");
pcntl_signal(SIGPIPE, "sig_handler");
pcntl_signal(SIGALRM, "sig_handler");
過一段時間,發現php進程退出了,日誌中出現了如下日誌信息:
2014-11-23 18:30:06 exit signo[14]
2014-11-23 18:30:06 [error]is_end[no]
看來是sigalarm信號導致php進程退出了。這個信號是可以捕獲和處理的。這樣無關緊要的信號,我們還是忽略吧。最終的代碼如下:
declare(ticks = 1);
$is_end = false;
function catch_error(){
global $is_end;
$time = date('Y-m-d H:i:s');
$error = error_get_last();
$msg = "$time [error]";
if($is_end){
$msg .= "is_end[yes]";
}else{
$msg .= "is_end[no]";
}
if($error){
$msg .= var_export($error,1);
}
echo $msg."\r\n";
}
register_shutdown_function("catch_error");
function sig_handler($signo){
$time = date('Y-m-d H:i:s');
if($signo == 14){
//忽略alarm信號
echo $time." ignore alarm signo[{$signo}]\r\n";
}else{
echo $time." exit signo[{$signo}]\r\n";
exit("");
}
}
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
pcntl_signal(SIGINT, "sig_handler");
pcntl_signal(SIGQUIT, "sig_handler");
pcntl_signal(SIGILL, "sig_handler");
pcntl_signal(SIGPIPE, "sig_handler");
pcntl_signal(SIGALRM, "sig_handler");
while(1){
$content = fgets(STDIN);
if(empty($content)){
sleep(1);
}
//邏輯處理部分代碼省略
}
$is_end = true;
經過一段觀察,在日誌中又發現了alarm相關的日誌,但是php進程依然在。看來我們的修改有作用了。