ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
基本: sleep / usleep / time_nanosleep
<?php
// 秒単位の待機(最も基本)
sleep(2); // 2 秒待つ
// マイクロ秒単位(1秒 = 1,000,000 マイクロ秒)
usleep(500000); // 0.5 秒待つ
usleep(100000); // 100 ミリ秒
// ナノ秒単位(1秒 = 1,000,000,000 ナノ秒)
time_nanosleep(0, 500000000); // 0.5 秒待つ
time_nanosleep(2, 0); // 2 秒待つ(sleep(2) と同等)
// 戻り値:
// sleep: 成功 0、中断時に残秒数
// usleep: void
// time_nanosleep: 成功 true、中断時に残時間の配列
用途別の使い分け
| 用途 | 推奨関数 | 備考 |
|---|---|---|
| 1 秒以上の単純な待ち | sleep() | 最もシンプル |
| ミリ秒単位の精密待機 | usleep() | API のレート制御等 |
| シグナル割り込みを検知したい | time_nanosleep() | 残時間を返す |
| 絶対時刻まで待つ | time_sleep_until($ts) | UNIX タイム指定 |
| マイクロ秒精度のタイマー測定 | hrtime(true) 差分 | sleep ではなく計測用 |
Web リクエスト処理中の sleep は危険
PHP-FPM はワーカープロセスでリクエストを処理しているため、sleep(10) を入れるとそのワーカーが 10 秒間ブロックします。同時実行数 50 に対し sleep 入りエンドポイントへ 100 リクエスト来れば、50 件が 504 Gateway Timeout 等で詰まります。
// ❌ アンチパターン: Web 経由の処理で sleep を使う
public function send(Request $request)
{
Mail::to($request->email)->send(new Welcome());
sleep(5); // ←ワーカーが 5 秒ブロック!
Mail::to($request->email)->send(new FollowUp());
return response()->json(['ok' => true]);
}
// ✅ 正解: ジョブキューに非同期で投げ、遅延配信
public function send(Request $request)
{
Mail::to($request->email)->send(new Welcome());
SendFollowUpJob::dispatch($request->email)
->delay(now()->addMinutes(5)); // 5 分後に実行
return response()->json(['ok' => true]);
}
Laravel Queue での遅延実行
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class SendReminderJob implements ShouldQueue
{
use Dispatchable, Queueable;
public function __construct(public int $userId) {}
public function handle(): void
{
// 実処理
}
}
// dispatch + delay
SendReminderJob::dispatch($user->id)
->delay(now()->addHours(24));
// dispatchAfterResponse: レスポンス送信後に同プロセス内で実行
SendReminderJob::dispatchAfterResponse($user->id);
// onQueue で別キュー
SendReminderJob::dispatch($user->id)
->delay(now()->addMinutes(10))
->onQueue('reminders');
Laravel Queue は database / redis / sqs 等のバックエンドを使い、php artisan queue:work ワーカーが時刻を見て実行します。Web リクエストはすぐにレスポンスを返せます。
cron との使い分け
| 処理時間 | 推奨 |
|---|---|
| ~100ms(API レート制御) | usleep() 直接 |
| 1秒~10秒(ポーリング待ち) | CLI スクリプトでの sleep() |
| 1 分以上 | cron / Laravel Scheduler |
| 特定日時に 1 回だけ | Queue の delay |
| 毎日決まった時刻 | cron / Scheduler |
HTTP リトライでの指数バックオフ
API がエラーを返したときに即リトライすると相手サーバを追い込みます。指数バックオフ + ジッターが定石:
function callWithBackoff(callable $fn, int $maxAttempts = 5)
{
for ($attempt = 0; $attempt < $maxAttempts; $attempt++) {
try {
return $fn();
} catch (\Throwable $e) {
if ($attempt === $maxAttempts - 1) throw $e;
// 2^n * 100ms + 0-100ms のランダムジッター
$baseMs = (1 << $attempt) * 100;
$jitter = random_int(0, 100);
usleep(($baseMs + $jitter) * 1000);
}
}
}
// 利用
$response = callWithBackoff(fn() => Http::get('https://api.example.com'));
// Laravel 標準の retry ヘルパも便利
$response = retry(5, function () {
return Http::throw()->get('https://api.example.com');
}, 100); // 100ms 起点で指数バックオフ
Laravel HTTP クライアントのリトライ
use Illuminate\Support\Facades\Http;
// 3 回まで、100ms 間隔
$response = Http::retry(3, 100)->get('https://api.example.com');
// バックオフ関数
$response = Http::retry(5, function ($attempt, $exception) {
return $attempt * 100; // 100ms, 200ms, 300ms, 400ms, 500ms
})->get('https://api.example.com');
// 特定例外のみリトライ
$response = Http::retry(3, 100, function ($exception, $request) {
return $exception instanceof ConnectionException;
})->get('https://api.example.com');
シグナル割り込みを処理する
長時間 sleep 中に Ctrl+C 等が来たら、残時間を取って正しく停止できます:
$result = time_nanosleep(10, 0); // 10 秒待つ
if (is_array($result)) {
// 中断された場合 ['seconds' => x, 'nanoseconds' => y] が返る
echo "中断されました。残り {$result['seconds']} 秒\n";
}
// sleep の場合
$remaining = sleep(10);
if ($remaining > 0) {
echo "中断されました。残り $remaining 秒\n";
}
FAQ
Q: usleep の最大値は?
A: 公式には 1,000,000 マイクロ秒(1 秒)未満が推奨。それ以上は sleep() や time_nanosleep() を使ってください。
Q: CLI コマンドでの sleep は問題ない?
A: 問題なし。CLI は 1 プロセスで動くため、Web ワーカーをブロックする問題は起きません。
Q: set_time_limit(0) と sleep を組み合わせて長時間処理したい
A: CLI なら可。Web リクエストで使うと PHP-FPM や Nginx のタイムアウト設定にもひっかかるので、Queue / cron に切り出すべきです。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
- インストール方法
- 文法
- Composerのインストール
- 内部関数
- フレームワーク
- エラー一覧
- 改行出力
- printとechoの違い
- シングルクォートとダブルクォートの違い
- returnとyieldの違い
- var_dumpをログ出力
- CSV読み込み
- 待機・処理の遅延
- ログファイルにエラーを出力する方法
- エラーログ出力関数
- URLパラメータの配列化
- empty, is_null. issetの判定比較表
- httpステータスコードの付与
- バージョンの確認
- php.ini
- APIを呼び出す方法
- 外部ファイルを呼び出す方法
- カンマ区切りの文字列を配列に変換
- 配列からランダムに値を取り出す方法
- Webスクレイピング
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?