只要安装了php 命令行工具就行
运行示例:
php supervisor.php /usr/local/nginx/bin/nginx nobody (这后面还可以加上对应命令的参数,无参数留空就行) &
参数介绍:第一个为命令行的php可执行程序,第二个为本文下面的代码文件,第三个是需要启动的可以执行的程序路径,第四个是用什么角色启动它,后面的是预留参数,全部传递给这个可执行程序。
优点:
1、 需要守护的程序在 非daemon 状态下运行,出现错误退出时能立即重启
2、程序为daemon运行时,定时检测运行状态,1秒内重启
3、能够在特定的时间内设置重启的次数,次数超过配置数就不再重启,防止应用程序出现特别情况无法重启。
建议:
建议把程序调成非daemon状态下运行。
把以下代码复制另存为supervisor.php文件即可
[php]
//author email: tipboy@qq.com
$_retry_times=5;
$_retry_times_duration=60;//这个是多少时间内,重启了多少次,就不需要再重启了
$_times_arr=array();
$args=$_SERVER['argv'];
if(count($args)
{
write_log("args num error!");
write_log("etc: php supervisor.php /usr/local/nginx/bin/nginx nobody xxx");
write_log("第一个参数就是本文件,第二个参数是要监控的可执行文件路径,第三个是使用哪个用户执行,接下来的参数就是执行该执行文件所用的参数");
exit();
}
//$args[0] 为本文件名
$path=$args[1];
$username=$args[2];
for($i=3;$i>0;$i--)
array_shift($args);
while(1){
$pid=pcntl_fork();
if($pid==0)
{
//write_log("child ".getmypid()." run");
pcntl_exec($path,$args,$_SERVER);
write_log("execute file failed");
exit(0);
}
else if($pid>0)
{
//write_log(" main pid:".getmypid().", child_pid:".$pid);
$endpid=pcntl_waitpid($pid,$status,2);
//write_log("status:".$status);
if($status==0)
{
//说明可能是daemon程序,后台运行
if(file_exists("/proc/".($pid+1)."/stat"))
{
//说明进程存在,需要定时判断
write_log("program start success");
for (;;)
{
if(file_exists("/proc/".($pid+1)."/stat"))
{
//write_log("program is alive");
usleep(1000000);
}
else
{
write_log("program die");
break;
}
}
}
else
{
//说明进程不存在,并且不是非daemon状态。
write_log("program start failed");
exit(0);
}
}
else if($status>0)
{
//说明是非daemon 程序,退出来了,需要重新启动
write_log("program die");
//continue;
}
else
{
exit(0);
}
if(chk_need_start($_times_arr,$_retry_times_duration,$_retry_times))
{
continue;
}
else
{
break;
}
}
};
function write_log($msg)
{
print(date('Y-m-d H:i:s').' '.$msg."\n");
}
function chk_need_start(&$_times_arr,$_retry_times_duration,$_retry_times)
{
foreach($_times_arr as $k=>$v)
{
//write_log("duration:".$_retry_times_duration);
if($k
{
//write_log("do unset");
unset($_times_arr[$k]);
}
}
//write_log("buffer count:".count($_times_arr));
if(count($_times_arr)>=$_retry_times)
{
return false;
}
else
{
$_times_arr[time()]=1;
return true;
}
}
?>
//author email: tipboy@qq.com
$_retry_times=5;
$_retry_times_duration=60;//这个是多少时间内,重启了多少次,就不需要再重启了
$_times_arr=array();
$args=$_SERVER['argv'];
if(count($args)
{
write_log("args num error!");
write_log("etc: php supervisor.php /usr/local/nginx/bin/nginx nobody xxx");
write_log("第一个参数就是本文件,第二个参数是要监控的可执行文件路径,第三个是使用哪个用户执行,接下来的参数就是执行该执行文件所用的参数");
exit();
}
//$args[0] 为本文件名
$path=$args[1];
$username=$args[2];
for($i=3;$i>0;$i--)
array_shift($args);
while(1){
$pid=pcntl_fork();
if($pid==0)
{
//write_log("child ".getmypid()." run");
pcntl_exec($path,$args,$_SERVER);
write_log("execute file failed");
exit(0);
}
else if($pid>0)
{
//write_log(" main pid:".getmypid().", child_pid:".$pid);
$endpid=pcntl_waitpid($pid,$status,2);
//write_log("status:".$status);
if($status==0)
{
//说明可能是daemon程序,后台运行
if(file_exists("/proc/".($pid+1)."/stat"))
{
//说明进程存在,需要定时判断
write_log("program start success");
for (;;)
{
if(file_exists("/proc/".($pid+1)."/stat"))
{
//write_log("program is alive");
usleep(1000000);
}
else
{
write_log("program die");
break;
}
}
}
else
{
//说明进程不存在,并且不是非daemon状态。
write_log("program start failed");
exit(0);
}
}
else if($status>0)
{
//说明是非daemon 程序,退出来了,需要重新启动
write_log("program die");
//continue;
}
else
{
exit(0);
}
if(chk_need_start($_times_arr,$_retry_times_duration,$_retry_times))
{
continue;
}
else
{
break;
}
}
};
function write_log($msg)
{
print(date('Y-m-d H:i:s').' '.$msg."\n");
}
function chk_need_start(&$_times_arr,$_retry_times_duration,$_retry_times)
{
foreach($_times_arr as $k=>$v)
{
//write_log("duration:".$_retry_times_duration);
if($k
{
//write_log("do unset");
unset($_times_arr[$k]);
}
}
//write_log("buffer count:".count($_times_arr));
if(count($_times_arr)>=$_retry_times)
{
return false;
}
else
{
$_times_arr[time()]=1;
return true;
}
}
?>

PHPSession失效的原因包括配置錯誤、Cookie問題和Session過期。 1.配置錯誤:檢查並設置正確的session.save_path。 2.Cookie問題:確保Cookie設置正確。 3.Session過期:調整session.gc_maxlifetime值以延長會話時間。

在PHP中調試會話問題的方法包括:1.檢查會話是否正確啟動;2.驗證會話ID的傳遞;3.檢查會話數據的存儲和讀取;4.查看服務器配置。通過輸出會話ID和數據、查看會話文件內容等方法,可以有效診斷和解決會話相關的問題。

多次調用session_start()會導致警告信息和可能的數據覆蓋。 1)PHP會發出警告,提示session已啟動。 2)可能導致session數據意外覆蓋。 3)使用session_status()檢查session狀態,避免重複調用。

在PHP中配置會話生命週期可以通過設置session.gc_maxlifetime和session.cookie_lifetime來實現。 1)session.gc_maxlifetime控制服務器端會話數據的存活時間,2)session.cookie_lifetime控制客戶端cookie的生命週期,設置為0時cookie在瀏覽器關閉時過期。

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3 Linux新版
SublimeText3 Linux最新版

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。