Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】DOMEntityReference::__sleep()メソッドの使い方

__sleepメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

『__sleepメソッドは、DOMEntityReferenceオブジェクトのシリアライズを禁止する処理を実行するメソッドです。PHPには、serialize関数を使ってオブジェクトを文字列に変換し、保存や転送が可能な形式にする「シリアライズ」という仕組みがあります。このシリアライズの過程で、対象のオブジェクトに__sleepメソッドが定義されている場合、PHPは自動的にこのメソッドを呼び出します。しかし、DOMEntityReferenceオブジェクトは、XMLドキュメントの内部構造への参照といった、単純に文字列化して保存することができない複雑な情報を含んでいます。このようなオブジェクトを無理にシリアライズしようとすると、データの不整合や予期せぬエラーの原因となります。そのため、このクラスの__sleepメソッドは、シリアライズ処理が試みられた際に意図的に例外を発生させるように設計されています。これにより、開発者が誤ってDOMEntityReferenceオブジェクトをシリアライズしようとすることを防ぎ、プログラムの安全性を確保する役割を担っています。したがって、このメソッドは開発者が直接呼び出すものではなく、PHPの内部機構によってオブジェクトの不適切な使用を防止するために存在します。』

構文(syntax)

1public function __sleep(): array;

引数(parameters)

引数なし

引数はありません

戻り値(return)

array

DOMEntityReference::__sleep は、オブジェクトをシリアライズする際に使用されるプロパティ名を格納した配列を返します。

サンプルコード

PHPで0.5秒待機する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * 指定した秒数(小数も可)だけプログラムの実行を待機させるサンプルです。
7 *
8 * usleep() 関数はマイクロ秒単位で実行を停止します。
9 * 1秒 = 1,000,000マイクロ秒です。
10 */
11function demonstrateSleep(): void
12{
13    // 待機する秒数を指定します。
14    $secondsToSleep = 0.5;
15
16    echo "処理を開始します。" . PHP_EOL;
17    echo date('Y-m-d H:i:s') . " ... " . $secondsToSleep . "秒待機します。" . PHP_EOL;
18
19    // 開始時刻を記録します(検証用)。
20    $startTime = microtime(true);
21
22    // 秒数をマイクロ秒に変換します (例: 0.5秒 -> 500,000マイクロ秒)。
23    $microsecondsToSleep = (int)($secondsToSleep * 1000000);
24
25    // 指定されたマイクロ秒だけプログラムの実行を停止します。
26    usleep($microsecondsToSleep);
27
28    // 終了時刻を記録します(検証用)。
29    $endTime = microtime(true);
30
31    echo date('Y-m-d H:i:s') . " ... 待機を終了しました。" . PHP_EOL;
32
33    // 実際の経過時間を計算して表示します。
34    $elapsedTime = round($endTime - $startTime, 4);
35    echo "実際の経過時間: " . $elapsedTime . "秒" . PHP_EOL;
36}
37
38// 作成した関数を実行します。
39demonstrateSleep();
40

このPHPサンプルコードは、プログラムの実行を0.5秒のような小数点を含む秒数だけ一時停止する方法を示しています。この処理を実現するために中心的な役割を担っているのが usleep() 関数です。この関数は、引数で指定された時間だけプログラムの実行を停止させます。

usleep() 関数の特徴は、引数を「マイクロ秒」単位で指定する点です。1秒は1,000,000マイクロ秒に相当するため、秒単位で指定したい場合は単位を変換する必要があります。サンプルコードでは、0.5秒間停止させるために、まず0.51000000を掛けて500000というマイクロ秒の値を計算しています。そして、この計算結果を整数としてusleep()関数の引数に渡すことで、意図した時間だけ処理を待機させています。また、microtime()関数を使って待機前後の時刻を記録し、実際の経過時間を表示することで、usleep()関数が正確に動作したことを確認できるようにしています。

このコードで使われている usleep() 関数は、秒単位ではなくマイクロ秒単位でプログラムの実行を停止させます。1秒は1,000,000マイクロ秒なので、0.5秒のように小数で待機させたい場合は、1,000,000を掛けてマイクロ秒に変換する必要があります。この関数の引数は整数でなければならないため、計算結果を(int)で整数に変換する処理は重要です。また、プログラムの待機時間はOSの状況などにも影響されるため、必ずしも指定した時間と正確に一致するわけではありません。わずかな誤差が生じる可能性があることを前提として利用してください。

PHPでミリ秒単位の待機処理を行う

1<?php
2
3/**
4 * 指定されたミリ秒だけプログラムの実行を遅延させます。
5 *
6 * @param int $milliseconds 遅延させる時間(ミリ秒単位)。
7 * @return void
8 */
9function sleepForMilliseconds(int $milliseconds): void
10{
11    // usleep関数はマイクロ秒単位で引数をとるため、ミリ秒を1000倍して変換します。
12    // (1ミリ秒 = 1000マイクロ秒)
13    usleep($milliseconds * 1000);
14}
15
16// 処理開始前のタイムスタンプを記録します。
17$startTime = microtime(true);
18echo "処理を開始します。現在時刻: " . date('H:i:s') . PHP_EOL;
19
20// 待機させたい時間をミリ秒で指定します。
21$sleepTime = 1500; // 1500ミリ秒 = 1.5秒
22
23echo $sleepTime . "ミリ秒待機します..." . PHP_EOL;
24
25// 作成した関数を呼び出して、プログラムを一時停止させます。
26sleepForMilliseconds($sleepTime);
27
28// 処理終了後のタイムスタンプを記録します。
29$endTime = microtime(true);
30echo "処理を再開しました。現在時刻: " . date('H:i:s') . PHP_EOL;
31
32// 実際に経過した時間を計算して表示します。
33$elapsedTime = ($endTime - $startTime) * 1000;
34echo "実際の経過時間: " . round($elapsedTime) . "ミリ秒" . PHP_EOL;
35
36?>

このPHPサンプルコードは、プログラムの実行を指定したミリ秒(1000分の1秒)単位で一時停止させる方法を示しています。

PHPには秒単位で待機するsleep()関数がありますが、より細かいミリ秒単位で処理を停止させたい場合にはusleep()関数を使用します。usleep()関数は、引数にマイクロ秒(100万分の1秒)単位の時間を整数で指定すると、その時間だけプログラムの実行を遅延させます。

このコードでは、sleepForMillisecondsという独自の関数を定義しています。この関数は、引数として受け取ったミリ秒の値を1000倍してマイクロ秒に変換し、それをusleep()関数に渡すことで、ミリ秒単位での待機を実現しています。戻り値はなく、処理を一時停止させること自体が目的です。

コードの実行部分では、処理の開始時刻と終了時刻を記録し、その差を計算することで、sleepForMilliseconds(1500)によって実際に約1500ミリ秒(1.5秒)処理が停止したことを確認できます。このように、APIへの連続アクセスを避けるための時間調整など、精密な待機処理が必要な場面で活用できます。

このサンプルコードで使われている usleep 関数は、引数をマイクロ秒単位で受け取ります。ミリ秒単位でプログラムを停止させたい場合は、値を1000倍する必要がある点に注意してください。秒単位で停止させる sleep 関数も存在するため、単位を混同しないようにしましょう。この処理はプログラムの実行を完全にブロックします。そのため、Webサイトのような同時に多くのリクエストを処理する環境で安易に長い時間停止させると、サーバー全体の応答性能に悪影響を与える可能性があります。また、OSの状況によっては指定した時間よりもわずかに長く停止することもあります。

関連コンテンツ

関連プログラミング言語