こんにちは。よっしーです(^^)
今日は、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 にインストールされている必要があります。
以下はコードの主要なポイントと、各部分の機能についての解説です。
demo()
関数:
timecop_freeze
関数が存在しない場合にメッセージを表示して終了します。これは、timecop
拡張モジュールが利用できない場合や、未インストールの場合にエラーを防ぐための確認です。$freezeUnixtimestamp
変数に、2023-12-01 12:00:00
のUNIXタイムスタンプを取得して格納します。timecop_freeze
関数を使って日時を固定し、その前後で現在の日時を表示しています。sleep(10)
を使用して10秒間待機してから、再び現在の日時を表示します。timecop_travel
関数を使って、指定した日時に進み、その前後で現在の日時を表示します。- 再び
sleep(10)
を使用して10秒間待機してから、現在の日時を表示します。 - 最後に
timecop_return
関数を使って、日時を元に戻し、その前後で現在の日時を表示します。
printDate()
関数:
- 現在の日時を
DateTime
クラスとdate
関数を使用して表示するための関数です。
- 実行部分:
demo()
関数を呼び出して、それによりtimecop
拡張モジュールが正しく利用可能であるかどうかを確認し、日時の固定、進行、戻りを行いつつ、その都度現在の日時を表示しています。
注意: このコードは timecop
拡張モジュールがインストールされていることを前提としており、その他の環境で実行するとエラーが発生する可能性があります。 timecop
拡張モジュールの詳細な使い方やインストール方法は、公式のドキュメントやリソースを参照してください。
おわりに
今日は、PHPにおいてtimecopで任意の日時で動作させる方法についてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント
初コメント失礼します!
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