PHP入門:timecopで任意の日時で動作させる

スポンサーリンク
PHP入門:timecopで任意の日時で動作させる ノウハウ
PHP入門:timecopで任意の日時で動作させる
この記事は約7分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、PHPにおいてtimecopで任意の日時で動作させる方法についてご紹介します。

スポンサーリンク

背景

PHPにおいて任意の日時で動作確認をする方法について調査する機会があったので、そのときの内容を備忘として残しました。

この記事のソースは下記のサイトにアップしています。

概要

本記事では、下記のライブラリを使用して、任意の日時で動作させることを確認しています。

timecop はPHPで時間を操作するための拡張モジュールの一つです。これは主にテストのコンテキストで使用され、現在の日時を固定したり、特定の日時に進んだり、戻ったりするための機能を提供します。これにより、時間に依存するコードの単体テストを容易に行うことができます。

timecop 拡張モジュールを使用するには、まずPHPに拡張モジュールをインストールし、有効にする必要があります。具体的な手順やサポートされている関数については、PHPの公式ドキュメントや timecop 拡張モジュールのリポジトリ、または他の関連するリソースを確認することをお勧めします。

以下は、timecop 拡張モジュールが提供する一般的な関数の例です(注意: 実際の関数名や使い方は環境によって異なる可能性があります):

  • timecop_freeze: 現在の日時を固定するための関数。
  • timecop_travel: 指定した日時に進むための関数。
  • timecop_return: 日時を元に戻すための関数。

これらの関数を使用することで、テスト中に時間を操作して特定の条件でコードを実行することができます。関連する文書やリソースで、具体的な利用法や注意事項を確認してください。

修正ファイル一覧

        new file:   compose.yml
        new file:   php/Dockerfile
        new file:   php/src/Sample.php

compose.yml

version: '3.8'

services:

  php-cmd:
    build: ./php
    container_name: php-cmd
    volumes:
        - ./php/src:/work
    working_dir: /work

php/Dockerfile

FROM php:8.2-cli

RUN apt-get update \
 && apt-get install -y --no-install-recommends \
        git \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*

RUN cd /usr/local/src/ \
 && git clone https://github.com/kiddivouchers/php-timecop.git \
 && cd php-timecop \
 && phpize \
 && ./configure \
 && make \
 && make install \
 && echo "extension=timecop.so" >> /usr/local/etc/php/php.ini

php/src/Sample.php

<?php

function demo()
{
    if ( ! function_exists('timecop_freeze') ) {
        printf('Dose not exist timecop_freeze function'.PHP_EOL);
        return;
    }

    $freezeUnixtimestamp = (new \DateTime('2023-12-01 12:00:00'))->format('U');

    printf('---'.PHP_EOL);
    printf('timecop_freeze() before'.PHP_EOL);

    printDate();

    // 日時を固定
    timecop_freeze($freezeUnixtimestamp);

    printf('---'.PHP_EOL);
    printf('timecop_freeze() after'.PHP_EOL);

    printDate();

    printf('wait 10s'.PHP_EOL);

    sleep(10);

    printDate();

    // 日時へ変更
    timecop_travel($freezeUnixtimestamp);

    printf('---'.PHP_EOL);
    printf('timecop_travel() after'.PHP_EOL);

    printDate();

    printf('wait 10s'.PHP_EOL);

    sleep(10);

    printDate();

    // 日時を戻す
    timecop_return();

    printf('---'.PHP_EOL);
    printf('timecop_return() after'.PHP_EOL);

    printDate();
}

function printDate()
{
    printf('Datetime : %s '.PHP_EOL, (new \DateTime())->format('Y-m-d H:i:s'));
    printf('date     : %s '.PHP_EOL, date('Y-m-d H:i:s'));
}

demo();

動作確認

下記のコマンドを実行します。

# ビルド
docker compose build

# 動作確認
docker compose run -it --rm php-cmd php Sample.php

下記のような出力になっていれば成功です。

解説

php/src/Sample.php

このコードは、PHPの timecop 拡張モジュールを使用して、日時を操作するデモを行っています。timecop 拡張モジュールは、テスト目的で現在の日時を固定したり、特定の日時に進めたり、戻したりするためのツールです。ただし、注意が必要で、timecop 拡張モジュールが PHP にインストールされている必要があります。

以下はコードの主要なポイントと、各部分の機能についての解説です。

  1. demo() 関数:
  • timecop_freeze 関数が存在しない場合にメッセージを表示して終了します。これは、timecop 拡張モジュールが利用できない場合や、未インストールの場合にエラーを防ぐための確認です。
  • $freezeUnixtimestamp 変数に、2023-12-01 12:00:00 のUNIXタイムスタンプを取得して格納します。
  • timecop_freeze 関数を使って日時を固定し、その前後で現在の日時を表示しています。
  • sleep(10) を使用して10秒間待機してから、再び現在の日時を表示します。
  • timecop_travel 関数を使って、指定した日時に進み、その前後で現在の日時を表示します。
  • 再び sleep(10) を使用して10秒間待機してから、現在の日時を表示します。
  • 最後に timecop_return 関数を使って、日時を元に戻し、その前後で現在の日時を表示します。
  1. printDate() 関数:
  • 現在の日時を DateTime クラスと date 関数を使用して表示するための関数です。
  1. 実行部分:
  • demo() 関数を呼び出して、それにより timecop 拡張モジュールが正しく利用可能であるかどうかを確認し、日時の固定、進行、戻りを行いつつ、その都度現在の日時を表示しています。

注意: このコードは timecop 拡張モジュールがインストールされていることを前提としており、その他の環境で実行するとエラーが発生する可能性があります。 timecop 拡張モジュールの詳細な使い方やインストール方法は、公式のドキュメントやリソースを参照してください。

おわりに

今日は、PHPにおいてtimecopで任意の日時で動作させる方法についてご紹介しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

  1. おかもと より:

    初コメント失礼します!
    docker compose buildができません
    Git hubにそもそもymlファイルがないようです。ムジカの方からもクローンしましたが載せていたのは修正分だけでしょうか

    • よっしー より:

      コメントありがとうございます。

      下記のコマンドを試して見てもらえますでしょうか。エラーになるようでしたら、エラーを貼り付けてもらえると助かります。

      git clone git@github.com:Gate-Yossi/Musica.git

      cd Musica

      cd 28_learn_php-timecop

      docker compose build

      docker compose run -it –rm php-cmd php Sample.php

タイトルとURLをコピーしました