我用swoole寫了一個服務端,打算將他以守護進程的方式掛在伺服器上一直跑,並且能讓該腳本在因為出錯而意外退出之後能夠盡快重啟,請問怎麼做?
回覆內容:
我用swoole寫了一個服務端,打算將他以守護進程的方式掛在伺服器上一直跑,並且能讓該腳本在因為出錯而意外退出之後能夠盡快重啟,請問怎麼做?
linux nohup指令執行這個php腳本 然後寫個shell監控這個腳本的運作狀態 如果腳本死了 就重啟
把腳本寫成一直循環就可以了,像是 while(1),這樣就可以一直跑了。
在這個腳本頭,這個判斷,如果已經有這個腳本的進程了,就直接退出,沒有才執行,
另外寫個linix規劃任務,像是每分鐘去執行這個php腳本。
執行一次腳本之後,腳本就會一直跑了,計畫任務會每分鐘去執行這個腳本,如果這個腳本活著,就直接退出,死了就開始執行。
寫好php腳本。建議定期偵測記憶體佔用,核心邏輯就不寫了。這個跟業務有關。
<code>if(memory_get_usage()>100*1024*1024){ exit(0);//大于100M内存退出程序,防止内存泄漏被系统杀死导致任务终端 }</code>
假設該php檔案的路徑為/root/run.php
開啟終端機
<code>setsid php /root/run.php > /dev/null &</code>
編輯進程監控腳本,當進程不存在時,自動重新啟動 /root/monitor.sh
<code>#!/bin/bash alive=`ps aux|grep root\/run|grep -v grep|wc -l` if [ $alive -eq 0] then php /root/run.php > /dev/null & fi</code>
新增計劃任務(每分鐘檢測一次)
<code>crontab -e * * * * * /root/monitor.sh > /dev/null &</code>
手工
用一個簡單可靠的Shell腳本來守護一個可能會突發退出的PHP服務
/etc/rc.local 裡加入開機啟動指令:
<code>nohup /path/to/swoole.sh >>/path/to/swoole.sh.log 2>&1 &</code>
swoole.sh 內容如下:
<code>#!/bin/sh PREFIX=/home/eechen INTERVAL=1 nohup php ${PREFIX}/swoole.php >>${PREFIX}/swoole.log 2>&1 & echo $! > ${PREFIX}/swoole.pid while [ 1 ]; do if [ ! -d /proc/`cat ${PREFIX}/swoole.pid` ]; then nohup php ${PREFIX}/swoole.php >>${PREFIX}/swoole.log 2>&1 & echo $! > ${PREFIX}/swoole.pid echo 'NEW_PID:'`cat ${PREFIX}/swoole.pid && date '+%Y-%m-%d %H:%M:%S'` fi sleep ${INTERVAL} done</code>
其中:
<code>nohup 表示忽略SIGHUP信号(编号1),比如退出终端时发送的SIGHUP信号(kill -SIGHUP PID)会被忽略掉. >>${PREFIX}/swoole.log 表示把标准输出重定向(>>表示追加,>表示覆盖)到文件swoole.log 2>&1 表示将标准错误(2:stderr)重定向到标准输出(1:stdout). 结尾加上&表示将命令放入后台运行. $! 表示前面运行在后台的PHP进程PID.</code>
也就是swoole.sh每隔1秒檢測一次目錄/proc/PID是否存在,如果不存在,則重新啟動服務.
swoole.sh.log 記錄的是服務重新啟動的時間.
swoole.log 記錄的是服務自己的輸出.
例如用Shell守護vmstat:
<code>vmstat.sh #!/bin/sh PREFIX=/home/eechen INTERVAL=1 nohup vmstat 1 >>${PREFIX}/vmstat.log 2>&1 & echo $! > ${PREFIX}/vmstat.pid while [ 1 ]; do if [ ! -d /proc/`cat ${PREFIX}/vmstat.pid` ]; then nohup vmstat 1 >>${PREFIX}/vmstat.log 2>&1 & echo $! > ${PREFIX}/vmstat.pid echo 'NEW_PID:'`cat ${PREFIX}/vmstat.pid && date '+%Y-%m-%d %H:%M:%S'` fi sleep ${INTERVAL} done #运行 nohup /home/eechen/vmstat.sh >>/home/eechen/vmstat.sh.log 2>&1 & #杀死,可以看到vmstat被重启 kill `cat /home/eechen/vmstat.pid`</code>
這個vmstat.sh的腳本也可以用PHP實作:
<code>nohup php /home/eechen/vmstat.php >>/home/eechen/vmstat.php.log 2>&1 & <?php $prefix = '/home/eechen'; $interval = 1; shell_exec("nohup vmstat 1 >>$prefix/vmstat.log 2>&1 & echo $! > $prefix/vmstat.pid"); while ( 1 ) { if ( !file_exists('/proc/'.trim(file_get_contents("$prefix/vmstat.pid"))) ) { shell_exec("nohup vmstat 1 >>$prefix/vmstat.log 2>&1 & echo $! > $prefix/vmstat.pid"); echo 'NEW_PID:'.trim(file_get_contents("$prefix/vmstat.pid")).' '.date('Y-m-d H:i:s'); } sleep($interval); }</code>
1.crontab肯定得有,每分都去檢測有沒有,(ps -ef | grep..),有退出,沒有就建立執行
2.一直運行的進程,可以死循環..
3.crontab腳本可以檢測你這一直運行進程的狀態,出問題,一直等待,沒響應還是別的問題,得自己能殺死且重啟
Linux shell執行

tomakephpapplicationsfaster,關注台詞:1)useopcodeCachingLikeLikeLikeLikeLikePachetoStorePreciledScompiledScriptbyTecode.2)MinimimiedAtabaseSqueriSegrieSqueriSegeriSybysequeryCachingandeffeftExting.3)Leveragephp7 leveragephp7 leveragephp7 leveragephpphp7功能forbettercodeefficy.4)

到ImprovephPapplicationspeed,關注台詞:1)啟用opcodeCachingwithapCutoredUcescriptexecutiontime.2)實現databasequerycachingingusingpdotominiminimizedatabasehits.3)usehttp/2tomultiplexrequlexrequestsandreduceconnection.4 limitesclection.4.4

依赖注入(DI)通过显式传递依赖关系,显著提升了PHP代码的可测试性。1)DI解耦类与具体实现,使测试和维护更灵活。2)三种类型中,构造函数注入明确表达依赖,保持状态一致。3)使用DI容器管理复杂依赖,提升代码质量和开发效率。

DatabasequeryoptimizationinPHPinvolvesseveralstrategiestoenhanceperformance.1)Selectonlynecessarycolumnstoreducedatatransfer.2)Useindexingtospeedupdataretrieval.3)Implementquerycachingtostoreresultsoffrequentqueries.4)Utilizepreparedstatementsforeffi

phpisusedforsenderemailsduetoitsbuilt-inmail()函數andsupportivelibrariesLikePhpMailerAndSwiftMailer.1)usethemail()functionForbasiceMails,butithasimails.2)butithasimail.2)

依賴性(di)inphpenhancesCodeFlexibility andTestability by decouplingClassesscyclasses fromtheippentencies.1)UseConstructorientoctionTopAssDopassDectiesViactructors Viactructors

推薦Pimple用於簡單項目,Symfony的DependencyInjection用於復雜項目。 1)Pimple適合小型項目,因其簡單和靈活。 2)Symfony的DependencyInjection適合大型項目,因其功能強大。選擇時需考慮項目規模、性能需求和學習曲線。

依賴性注射(DI)InphpisadesignpatternwhereClassDepentenciesArepassedtotosedTosedTosedTotratherThancReateDinterally,增強codemodemodularityAndTestabily.itimprovessoftwarequalitybyby By:1)增強tosestabilityTestabilityTestabilityThroughityThroughEasyDepentyDepententymydependentymocking,2)增強Flexibilybya


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

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

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

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境