搜尋
首頁後端開發php教程PHP定時器的說明

PHP定時器的說明

Jul 06, 2018 pm 04:31 PM
php定時器

這篇文章主要介紹了關於PHP定時器的說明,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

常見的定時器有兩種:一種週期性定時執行,例如每天的凌晨三點出報表;另一種在指定時間後執行(一次),例如會員登入系統五分鐘後發放每日登入獎勵。兩種情況對應shell中的cronat指令,與JavaScript中的setIntervalsetTimeout函數類似(嚴格來說setInterval是週期性執行,指定時間點執行需要自行處理)。

做web開發的PHP程式設計師對JavaScript中的兩個定時器函數應該都還熟悉,回到PHP層面就有點傻眼:PHP中有sleep,但是沒有(內置)定時器函數可用。 sleep函數勉強可以做到,但會導致進程阻塞,期間不能做其他事(或無回應)。為什麼PHP沒能提供定時器(Timer)這個功能呢?

原因

個人認為,web開發中PHP不能使用定時器的本質原因是可控 常駐記憶體運行環境的缺失。兩個重點:第一常駐內存,第二可控。 CGI模式下,進程執行完腳本後直接退出,不能指望其到指定時間運行任務;PHP-FPM模式下,進程(絕大多數)常駐內存,但不可控。

不可控的意思是執行PHP的進程不受PHP程式碼影響,進程的入口點和退出時機由額外的程式控制。例如FPM模式下,PHP腳本中的exitdie函數只會中斷腳本的執行,不會對執行腳本的程序產生特別的影響(記憶體外洩除外)。 PHP開發人員編寫的腳本是進程的執行體,執行完畢後就從進程的執行上下文中卸載出去。在這種情況下,執行PHP腳本的時機仍然由外部驅動,沒有外部請求PHP程式碼就安詳的躺在硬碟上,什麼都不做,也就定時任務。

由於PHP主要針對web開發,PHP這種執行模式穩定可靠,開發效率快。例如省去資源釋放這一步,就避免了開發中許多工作量和坑。想想某些第三方函式庫程式碼中改時區、字元編碼等還不還原,在常駐記憶體運作環境下幾乎肯定會導致後續請求有問題。但在FPM模式下,這種坑無意中直接趟平,省去許多調試時間,為程式設計師保住髮際線做出了不小的貢獻。

問題已經了解,那麼PHP如何使用定時器執行定時任務?

危險的做法

在web環境下,PHP腳本預設有逾時時間。去掉超時設置,就可以讓程式一直在背景運行(如果進程不退出的話)。例如以下程式碼在回應請求後繼續後台運行,並且每五秒鐘輸出一次時間到檔案:

# test.php
set_time_limit(0); # 取消超时设置,让脚本可一直运行

echo 'This is a background run forever script. Now you can leave me alone.';

fastcgi_finish_request();   # 结束当前请求

do{
   file_put_contents("/tmp/out.dat", "test script, now:" . date("Y-m-d H:i:s") . "\n", FILE_APPEND);
   sleep(5);
}while(true);

請求http://localhost:8080/test.php檔案後,監控/tmp/out.dat文件,會發現不斷有內容輸出,無論客戶端是否斷開連線、關閉瀏覽器或重新啟動電腦(無法重新啟動伺服器)。這說明程式一直在執行,也實作了我們想要的定時器功能。如果把sleep改成usleeptime_nanosleep,還能實作微秒、奈秒定時器,豈不美哉?

實務上應盡量避免以這種方式實現定時器,不僅因為低效,還略有危險。原因之一是每次請求會佔用一個進程,請求十萬次需要十萬個進程,基本上會導致系統崩潰或後續請求無響應;另外如果打開了session,但是忘記調用session_write_close ,會導致同一個使用者的後續請求被hang住(session活躍時處於加鎖狀態,不關閉session會導致後續進程無法開啟session)。

web開發應當越快回應使用者的要求越好,在web開發中用這種方式強行實作定時器,會讓整個web應用程式處於不穩定、不可靠或不可預測狀態。孟子曰:知而慎行,君子不立於危牆之下。不靠譜的做法要盡量避免,順帶也避免背鍋和甩鍋。

接下來看看PHP中使用定時器的正確姿勢。

正確的姿勢

PHP實作計時器的做法可簡單歸結為下列幾種:

  1. 使用cron、Jenkins等調度工具做週期性定時任務(既可以是執行腳本,也可以是請求某個網址);

  2. #一次執行任務透過訊息佇列、資料庫等方式投遞給第三方程式執行;

  3. 像WordPress一樣模擬定時任務,但要記住這種方式依賴客戶端請求,並需自行處理好進程並發問題;

  4. 使用常駐記憶體型方式執行PHP程序,即CLI模式。

除了第三種做法,其他方式都是建議的,具體方案請結合實際需求。身為PHP程式設計師,當然還是首選用PHP來做,也就是CLI模式。

CLI模式

摸著良心說,CLI模式讓PHP發揮的空間拓展不少。在CLI模式下,程式的入口點就是腳本,且程式碼可以常駐內存,進程完全由PHP程式碼控制。在這種形式下,實作定時器就有多種玩法。本文列出幾種做法,拋磚引玉:

  1. 使用swooleworkerman等框架,內建(高精度)計時器;

  2. 使用多進程(池)/多執行緒(池)技術(pcntlpthreads拓展在CLI模式下才可使用);

  3. 處理tick或alarm等訊號;

  4. #使用libeventlibev等事件驅動程式庫;

  5. sleep加上循環或自行實作事件循環。

想折騰的話自己用2-5方案,不想折騰swooleworkerman等框架是首選,穩定可靠。

總結

區分HTTP請求和任務的關係,實現定時任務就簡單了。至於用不用PHP來實現,那是另外一回事。當然作為web開發的首選語言,PHP實現定時任務也是輕而易舉的。

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

PHP的類別修飾符與存取修飾符

php簡單使用shmop函數建立共享內存減少伺服器負載

以上是PHP定時器的說明的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
解釋負載平衡如何影響會話管理以及如何解決。解釋負載平衡如何影響會話管理以及如何解決。Apr 29, 2025 am 12:42 AM

負載均衡會影響會話管理,但可以通過會話複製、會話粘性和集中式會話存儲解決。 1.會話複製在服務器間複製會話數據。 2.會話粘性將用戶請求定向到同一服務器。 3.集中式會話存儲使用獨立服務器如Redis存儲會話數據,確保數據共享。

說明會話鎖定的概念。說明會話鎖定的概念。Apr 29, 2025 am 12:39 AM

Sessionlockingisatechniqueusedtoensureauser'ssessionremainsexclusivetooneuseratatime.Itiscrucialforpreventingdatacorruptionandsecuritybreachesinmulti-userapplications.Sessionlockingisimplementedusingserver-sidelockingmechanisms,suchasReentrantLockinJ

有其他PHP會議的選擇嗎?有其他PHP會議的選擇嗎?Apr 29, 2025 am 12:36 AM

PHP會話的替代方案包括Cookies、Token-basedAuthentication、Database-basedSessions和Redis/Memcached。 1.Cookies通過在客戶端存儲數據來管理會話,簡單但安全性低。 2.Token-basedAuthentication使用令牌驗證用戶,安全性高但需額外邏輯。 3.Database-basedSessions將數據存儲在數據庫中,擴展性好但可能影響性能。 4.Redis/Memcached使用分佈式緩存提高性能和擴展性,但需額外配

在PHP的上下文中定義'會話劫持”一詞。在PHP的上下文中定義'會話劫持”一詞。Apr 29, 2025 am 12:33 AM

Sessionhijacking是指攻擊者通過獲取用戶的sessionID來冒充用戶。防範方法包括:1)使用HTTPS加密通信;2)驗證sessionID的來源;3)使用安全的sessionID生成算法;4)定期更新sessionID。

PHP的完整形式是什麼?PHP的完整形式是什麼?Apr 28, 2025 pm 04:58 PM

文章討論了PHP,詳細介紹了其完整形式,在We​​b開發中的主要用途,與Python和Java的比較以及對初學者的學習便利性。

PHP如何處理形式數據?PHP如何處理形式數據?Apr 28, 2025 pm 04:57 PM

PHP使用$ \ _ post和$ \ _獲取超級全局的php處理數據,並通過驗證,消毒和安全數據庫交互確保安全性。

PHP和ASP.NET有什麼區別?PHP和ASP.NET有什麼區別?Apr 28, 2025 pm 04:56 PM

本文比較了PHP和ASP.NET,重點是它們對大規模Web應用程序,性能差異和安全功能的適用性。兩者對於大型項目都是可行的,但是PHP是開源和無關的,而ASP.NET,

PHP是對病例敏感的語言嗎?PHP是對病例敏感的語言嗎?Apr 28, 2025 pm 04:55 PM

PHP的情況敏感性各不相同:功能不敏感,而變量和類是敏感的。最佳實踐包括一致的命名和使用對案例不敏感的功能進行比較。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)