php中strtotime函式效能分析

2022-10-06 07:36:12 字數 1915 閱讀 6591

最近在做乙個遊戲資料統計後台,最基礎的功能是通過分析註冊登入日誌來展示使用者資料。在公司內部測試,使用者量很少,所以就沒有發現什麼效能問題。但是這兩天一起放到真實的測試環境,使用者量噌噌地就湧進來了,從下午開始,**人數的統計開始卡,幾秒鐘才返回資料;註冊人數的查詢速度還行。到了晚上,**人數的統計基本上就載入超時打不開了。雖然不知他們遊戲端那邊什麼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') );

pfdda$__startt = microtime(true);

for($i=0; $i$xaxis1.'~'.$xaxis2,

'number'=>$count

];}echo microtime(true)-$__startt;

那這樣的話,基本上是沒辦法再用這個strtotime的函式的了,那還有什麼辦法比較時間大小呢?答案很簡單粗暴,php裡面可以直接比較兩個日期時間字串!所以改過後的**如下。然後現在的執行時間大概是 0.3秒

$__startt = microtime(true);

for($i=0; $i$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=$enddt) break; //大於結束時間則結束

$count ++; 程式設計客棧 //否則為符合條件

//原始的演算法

// if( $startdt<=$time && $time

這裡巧用了 continue 和 break 關鍵字,用於跳過一次循www.cppcns.com環和結束整個迴圈。這次的話,一天中剛開始的時間統計中,後面很大一部分資料的都可以直接跳過。最後總遍歷時間縮短為約0.12秒 。

總結,在大型的資料處理中,應該盡量避免在遍歷中進行資料的轉換,避免用一些原理複雜的函式。如strtotime

本文標題: php中strtotime函式效能分析

本文位址: /wangluo/php/170568.html

PHP的時間函式strtotime

時間加減 php view plain copy 獲取本地提取年份 1 date date y m d mktime 0,0,0,date m date d date y 1 如果要獲取資料庫中的時間應該如何處理呢?在php文件中找到了乙個很好的函式strtotime,可以對時間進行加減 php v...

PHP函式strtotime 理解筆記

官方手冊裡面對strtotime的描述 strtotime 函式將任何英文文字的日期時間描述解析為 unix 時間戳。那麼意味著這個函式可以把2010 02 28 18 31 33轉換為1267353093這種格式 但是使用它轉換時間戳的時候要注意的是伺服器的date.timezone的配置,在函式...

使用php的strtotime 函式

我們在日常業務中,針對業務量,經常會採用對資料庫按時間做橫向分表,分表後的查詢往往會涉及到時間問題。例如,我們想查詢某個使用者距離當前時間1個月的訂單情況,在這個時候,我們有些會用到strtotime 函式去處理。但是使用strtotime 需要非常謹慎。我們先看一段 目的是想拿到幾個月以前的年份月...