ホームページ バックエンド開発 PHPチュートリアル PHPのstrtotime関数の詳しい説明

PHPのstrtotime関数の詳しい説明

Jul 09, 2017 am 09:46 AM
php strtotime 関数

strtotime() は、php の時間関数です。その機能は、string の形式の日付と時刻を、対応する Unix の timestamp に変換することです。今日は、特定の例を使用して strtotime() 関数のパフォーマンスの問題を詳細に分析します。最近、私はゲーム データ統計バックエンドに取り組んでいます。最も基本的な機能は、登録ログとログイン ログを分析してユーザー データを表示することです。社内テストではユーザー数が非常に少なかったため、パフォーマンス上の問題は見つかりませんでした。しかし、この 2 日間は実際のテスト環境に置かれ、午後から大量のユーザーが殺到し、オンラインのユーザーの統計が滞り始め、データを返すのに数秒かかりました。登録者数は大丈夫でした。夜になるとオンライン人口の統計が基本的にタイムアウトして開けなくなります。ゲーム側にどのようなバグがあるのか​​はわかりませんが、プレイヤーはログインの問題に頻繁に遭遇し、その結果、オンラインおよび登録者数が少なくなります。しかし、この量のデータではクエリ速度が十分ではなく、非常に恥ずかしいことです。

現在、彼らはゲームのバグをチェックしており、私は統計の背後にあるコードのパフォーマンスも調べています。まず最初に、私が統計に使用するデータはスレーブ データベースからのものであり、彼らのゲームはメイン データベースを使用していることを説明します。また、ここには管理者が数人しかいないため、ゲーム サーバーのパフォーマンスに影響を与えることは不可能です。 。

今日、プロジェクト チームのリーダーはすべてのデータベースを会社のサーバーにインポートしました。統計プラットフォームのパフォーマンスの問題がどこにあるのかを確認するために、コピーをローカル コンピューターにコピーしました。その後、登録統計が返されるまでにサーバーでは約 2 秒、ローカル コンピューターでは 20 秒以上かかり、タイムアウトになることがよくありました (PHP のデフォルト設定は 30 秒のタイムアウトです)。 ; 言うまでもなく、オンライン統計は開くことができません。データベースを調べたところ、その日の登録レコードは約 3,500 件しかありませんでした (偽のデータあり)。これらは 5 分ごとにカウントされており、これは 1 日あたり 288 回です。もちろん、これはデータベースを 288 回ループするような、死ぬほど叱られるようなクエリではありません。

期間内の登録数を統計します。ロジックも非常に単純です。各期間でデータを 1 回走査し、

時間サイズを比較し、一致する場合は +1 します。しかし、たった 100 万ループのこのような単純なロジックに 30 分もかかるのはなぜでしょうか?

重要な問題は時間の比較にあり、タイムスタンプは時間サイズを比較するためのより科学的な方法であることは誰もが知っており、データベースに記録される時間は通常、PHP の形式で YYYY-mm-dd HH:ii:ss になります。タイムスタンプに変換する strtotime 関数があります。ただし、288 for * 3500 foreach の祝福の後、ここでの実行時間は 30 分にもなります。

$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(&#39;H:i&#39;, $nowDayDT+$i);
  $xAxis2 = date(&#39;H:i&#39;, $nowDayDT+$i+$gapTime);

  foreach($rawData as $line){
    $time = strtotime($line[&#39;log_dt&#39;]);
    if( $startDT<=$time && $time<$endDT ){
      $count ++;
    }
  }
  $resArr[] = [
    &#39;date&#39;=>$xAxis1.&#39;~&#39;.$xAxis2,
    &#39;number&#39;=>$count
  ];
}
echo microtime(TRUE)-$startT;
ログイン後にコピー

この場合、基本的にこの strtotime 関数を使用する方法はもうありません。では、時間を比較する他の方法は何でしょうか?答えは単純ですが、PHP では 2 つの日付と時刻の文字列を直接比較できます。したがって、変更されたコードは次のようになります。現在の実行時間は約 0.3 秒です

$startT = microtime(TRUE);
for($i=0; $i<$allTime; $i += $gapTime){
  $count = 0;
  //用于数据比较的
  $startDT = date(&#39;Y-m-d H:i:s&#39;, $nowDayDT+$i);
  $endDT = date(&#39;Y-m-d H:i:s&#39;, $nowDayDT+$i+$gapTime);
  //用于显示的
  $xAxis1 = date(&#39;H:i&#39;, $nowDayDT+$i);
  $xAxis2 = date(&#39;H:i&#39;, $nowDayDT+$i+$gapTime);

  foreach($rawData as $line){
    $time = $line[&#39;log_dt&#39;];
    if( $startDT<=$time && $time<$endDT ){
      $count ++;
    }
  }
  $resArr[] = [
    &#39;date&#39;=>$xAxis1.&#39;~&#39;.$xAxis2,
    &#39;number&#39;=>$count
  ];
}
echo microtime(TRUE)-$startT;
ログイン後にコピー

トラバーサルしてから最適化しました

問題が見つかるかもしれません。for 内に foreach がネストされているため、パフォーマンスが少し心配になります。foreach を完全にトラバースする必要があるかどうか。内部?実際、その必要はありません。 SQLデータを確認する限り、時間順にソートされています。最適化された時間比較アルゴリズムは次のとおりです:

for{ ...
foreach($rawData as $line){
  $time = $line[&#39;log_dt&#39;];//strtotime($line[&#39;log_dt&#39;]);
  //优化算法计算
  if($time<$startDT) continue;  //小于开始时间则跳过
  if($time>=$endDT) break;    //大于结束时间则结束
  $count ++;            //否则为符合条件
  //原始的算法
//  if( $startDT<=$time && $time<$endDT ){
//    $count ++;
//  }
}
...}
ログイン後にコピー

ここでは、 continue キーワードと Break キーワードを巧みに使用して、ループをスキップし、ループ全体を終了します。今回は、その日の最初の時間の統計では、その後のデータの大部分を直接スキップできます。最終的に、総移動時間は約 0.12 秒に短縮されました。

要約すると、大規模なデータ処理では、トラバーサル中のデータ変換を避け、複雑な原理を持つ一部の関数の使用を避ける必要があります。ストラトタイムなど

以上がPHPのstrtotime関数の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP クイックガイド CakePHP クイックガイド Sep 10, 2024 pm 05:27 PM

CakePHP はオープンソースの MVC フレームワークです。これにより、アプリケーションの開発、展開、保守がはるかに簡単になります。 CakePHP には、最も一般的なタスクの過負荷を軽減するためのライブラリが多数あります。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

See all articles