php中strtotime函數效能分析_php技巧
strtotime()是php中的時間函數;其功能是:將任何字串形式的日期,時間轉換成對應的Unix 時間戳記。今天我們是透過具體的實例來詳細分析下strtotime()函數的效能問題
最近在做一個遊戲資料統計後台,最基礎的功能是透過分析註冊登入日誌來展示使用者資料。在公司內部測試,用戶量很少,所以就沒有發現什麼效能問題。但是這兩天一起放到真實的測試環境,用戶量噌噌地就湧進來了,從下午開始,在線人數的統計開始卡,幾秒鐘才返回數據;註冊人數的查詢速度還行。到了晚上,線上人數的統計基本上就加載超時打不開了。雖然不知他們遊戲端那邊什麼BUG,玩家那邊登入經常出問題,導致線上人數和註冊人數並不是很多。但是就這一點資料量我這邊查詢的速度也不行,這就很尷尬了。
現在他們那邊在查遊戲的BUG,我這邊也在看統計後台的程式碼到底表現出在哪裡。首先說明一下,我統計用的數據是從庫,他們遊戲用的是主庫,再說我這邊管理員人數就幾個,不可能會影響到遊戲服的效能問題。
今天專案組長把資料庫都導過來到公司內的伺服器。我拷了一份到本機,看看統計平台的效能問題出在哪裡。然後卻發現,居然連註冊統計都非常卡,伺服器上是兩秒左右返回,本機要二十幾秒,還經常超時(PHP的默認配置是30秒超時);在線統計的就不用說了肯定打不開。看了一下資料庫,當天的註冊記錄也就 3500 筆左右(有假數據),每五分鐘統計一次,一天就是統計 288 次。當然這裡肯定不是循環查詢資料庫288次,那樣會被罵死的吧。
統計時間段內的註冊數,邏輯也非常簡單,就是每個時間段遍歷一次數據,比較時間大小,符合就 1。但是為什麼這麼簡單的邏輯,也就一百萬次循環,怎麼會跑出了足足半分鐘的時間那麼久呢?
關鍵問題就出在於時間比較這裡了,我們都知道,時間戳是比較時間大小的一個比較科學的方法,而資料庫裡記錄的時間一般都是以YYYY-mm-dd HH: ii:ss 的形式,PHP裡有strtotime的函數轉換成時間戳記。然而在288個for * 3500個foreach 的加持之後,這裡的執行時間長達半分鐘。
$nowDayDT = strtotime( date('Y-m-d') ); $__startT = microtime(TRUE); for($i=0; $i<$allTime; $i += $gapTime){ $count = 0; //用于数据比较的 $startDT = $nowDayDT+$i; $endDT = $nowDayDT+$i+$gapTime; //用于显示的 $xAxis1 = date('H:i', $nowDayDT+$i); $xAxis2 = date('H:i', $nowDayDT+$i+$gapTime); foreach($rawData as $line){ $time = strtotime($line['log_dt']); if( $startDT<=$time && $time<$endDT ){ $count ++; } } $resArr[] = [ 'date'=>$xAxis1.'~'.$xAxis2, 'number'=>$count ]; } echo microtime(TRUE)-$__startT;
那這樣的話,基本上是沒辦法再用這個strtotime的函數的了,那還有什麼辦法比較時間大小呢?答案很簡單粗暴,PHP裡面可以直接比較兩個日期時間字串!所以改過後的程式碼如下。然後現在的運行時間大概是0.3秒
$__startT = microtime(TRUE); for($i=0; $i<$allTime; $i += $gapTime){ $count = 0; //用于数据比较的 $startDT = date('Y-m-d H:i:s', $nowDayDT+$i); $endDT = date('Y-m-d H:i:s', $nowDayDT+$i+$gapTime); //用于显示的 $xAxis1 = date('H:i', $nowDayDT+$i); $xAxis2 = date('H:i', $nowDayDT+$i+$gapTime); foreach($rawData as $line){ $time = $line['log_dt']; if( $startDT<=$time && $time<$endDT ){ $count ++; } } $resArr[] = [ 'date'=>$xAxis1.'~'.$xAxis2, 'number'=>$count ]; } echo microtime(TRUE)-$__startT;
#遍歷再優化
##大家可能發現一個問題,for裡面嵌套一個foreach,這效能有點擔憂,其中裡面的foreach 有必要完全遍歷嗎?其實是不必的。只要查SQL資料的時候,就按時間排序排出來。優化後的時間比較演算法如下:for{ ... foreach($rawData as $line){ $time = $line['log_dt'];//strtotime($line['log_dt']); //优化算法计算 if($time<$startDT) continue; //小于开始时间则跳过 if($time>=$endDT) break; //大于结束时间则结束 $count ++; //否则为符合条件 //原始的算法 // if( $startDT<=$time && $time<$endDT ){ // $count ++; // } } ...}
以上是php中strtotime函數效能分析_php技巧的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

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

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。
