PHPにおけるシングルトンについて

はじめに

PHPのコードを色々触っている時に、シングルトンなるものに出会ったのでまとめます!

今回のシングルトンというものは、デザインパターンの一つです。
そのために、まずはデザインパターンについて、軽く紹介させていただきます!

デザインパターンとは

過去のソフトウェア設計者が発見し編み出した設計ノウハウを蓄積し、名前をつけ、再利用しやすいように特定の規約に従ってカタログ化したものである。引用元(Wikipedia)

プログラミングには、この場合はこの書き方が正解。というようなものがいくつかあります。そう言ったものをデザインパターンと呼びます。
その中の一つがシングルトンパターンです。

シングルトンパターンとは

とあるクラスのインスタンスを2つ以上作成できないようにし、どのクラスからアクセスしても同じインスタンスを参照されることを保証します。

1つしか作成できないように強制するような機能というような感じです。

設計者が「1箇所以外から呼び出したくない!」と考えていても、別の箇所から呼び出し可能であれば、設計者の意図をくみ取れないビギナーズが遠慮なく複数生成することがありますよね?(私がその中の1人です…汗)

この複数生成を防ぐためにあるのが、シングルトンです。

通常であれば、複数のインスタンスを作成することができるが、インスタンス作成を1つのみにしたい場合に使用します。

Q:いくつもインスタンスを作成したくない場合ってどんな状況?

設定管理

アプリケーションの設定情報を保持するクラスは、通常は一つのインスタンスだけで十分です。
設定情報はアプリケーション全体で共有されるため、複数のインスタンスを持つと各データの一貫性が失われる可能性があります。

データベース接続

データベース接続は、リソースを多く消費して、複数の接続を開くとパフォーマンスが低下する可能性があります。
シングルトンを使うことで、アプリケーション全体で一つのデータベース接続を共有し、リソースの使用を効率化できます。

ロギング

ログを記録するクラスは、アプリケーション全体で一つだけあれば充分です。
シングルトンを使用すると、ログの記録に一貫性が保たれ、パフォーマンスの問題を避けることができます。

ハードウェアインターフェースの管理

ハードウェアリソース(プリンターなど)へのアクセスを管理する場合、シングルトンは一つのインスタンスを通じてリソースを共有し、競合することを防ぎます。

キャッシュ

データキャッシュやオブジェクトキャッシュのようなリソースは、アプリケーション内で一貫性と効率を保つために、通常は単一のインスタンスで管理されます。

複数のインスタンスが存在すると、データの整合性の問題や無駄なリソースの使用、パフォーマンスの低下などさまざまな問題が発生します。
シングルトンは、これらの問題を解決する効果的な方法です。
ですが、使用する際にはその影響範囲と制約を理解して適切に利用できるよう意識することが大事です。

【Laravelでcronを実装してみた!】

今回は、特定の処理を決まった時間に定期的に実行したいと思い。
Laravelのcron機能を実装してみたので、その備忘録も兼ねて、まとめていきたいと思います。
(Laravelのscheduleクラスを利用しております。)
https://readouble.com/laravel/10.x/ja/scheduling.html
※今回のLaravel バージョンは10です。

目次
――――――――――――――――――――――――――――
① 「cron」とは
② 基礎
③ 発展
④ まとめ
――――――――――――――――――――――――――――

①『cron』とは
cronとは、「定期的にタスクを自動実行するための機能」です。
「クーロン」と読みます。cronを利用すると時間を指定して、あらかじめ決まった時間にタスクを実行してくれます。

以下、「cron」の使用例です。
例)毎分ごとに特定のディレクトリを参照し、ファイルを読み込みたい。
例)日付が変わるタイミングで特定の処理をしたい。
例)毎月初めにステータスをリセットしたい。

②基礎
[1]まずは実行するプログラムを作成します。
・Laravelのコマンドでファイルを作成します。
php artisan make:command SendEmails

上記のコマンドにより、Commandsディレクトリにファイルが作成されます。
project
├─ app
│ ├─ Console
│ │ ├─ Commands
│ │ │ └─ SeendEmails
│ │ ├─ Kernel.php

[2]つぎにファイルを追記していきます。
・「$signature」変数にコマンド名を格納します。
例)protected $signature = ‘command:sendEmails’;

・「$description」変数に処理の内容を格納します。
例)protected $description = ‘メールを配信する。’;

・「handle()」メソッド内に処理を記載します。
例)public function handle() {

{
ここにしたい事を書く。
※今回は割愛します。
}

以上の手順にて、実行するプログラム(コマンド)を作成することができます。

③発展
基礎にてコマンドを作成したので、発展では定期的に実行できるようにタスクスケジュールをしていきましょう。

[1] Kernelファイルにスケジュールを記載する。
・ConsoleフォルダにあるKernel.phpファイルに追記します。
project
├─ app
│ ├─ Console
│ ├─ Commands
│ │ └─ SeendEmails
│ ├─ Kernel.php

・Kernal.phpの$commandsに追記する。
例)protected $commands = [
\App\Console\Commands\SendEmails::class,
];

・Kernal.phpのschedule()メソッドにてスケジュールを指定できる。
例)protected function schedule(Schedule $schedule)
{
$schedule->command(‘command:sendEmails’)->everyTenMinutes();
}

以上の設定にて、10分ごとにsendEmailsコマンドを実行するように設定することができます。

[2] スケジュールの種類

メソッド 説明
cron('* * * * *');
カスタムcronスケジュールでタスクを実行
everySecond();
毎秒タスク実行
everyTwoSeconds();
2秒毎にタスク実行
everyFiveSeconds();
5秒毎にタスク実行
everyTenSeconds();
10秒ごとにタスク実行
everyFifteenSeconds();
15秒毎にタスク実行
everyTwentySeconds();
20秒ごとにタスク実行
everyThirtySeconds();
30秒ごとにタスク実行
everyMinute();
毎分タスク実行
everyTwoMinutes();
2分毎にタスク実行
everyThreeMinutes();
3分毎にタスク実行
everyFourMinutes();
4分毎にタスク実行
everyFiveMinutes();
5分毎にタスク実行
everyTenMinutes();
10分毎にタスク実行
everyFifteenMinutes();
15分毎にタスク実行
everyThirtyMinutes();
30分毎にタスク実行
hourly();
毎時タスク実行
hourlyAt(17);
1時間ごと、毎時17分にタスク実行
everyOddHour($minutes = 0);
奇数時間ごとにタスク実行
everyTwoHours($minutes = 0);
2時間毎にタスク実行
everyThreeHours($minutes = 0);
3時間毎にタスク実行
everyFourHours($minutes = 0);
4時間毎にタスク実行
everySixHours($minutes = 0);
6時間毎にタスク実行
daily();
毎日深夜12時に実行
dailyAt('13:00');
毎日13:00に実行
twiceDaily(1, 13);
毎日1:00と13:00に実行
twiceDailyAt(1, 13, 15);
毎日1:15と13:15に実行
weekly();
毎週日曜日の00:00にタスク実行
weeklyOn(1, '8:00');
毎週月曜日の8:00に実行
monthly();
毎月1日の00:00にタスク実行
monthlyOn(4, '15:00');
毎月4日の15:00に実行
twiceMonthly(1, 16, '13:00');
毎月1日と16日の13:00にタスク実行
lastDayOfMonth('15:00');
毎月最終日の15:00に実行
quarterly();
四半期の初日の00:00にタスク実行
quarterlyOn(4, '14:00');
四半期の4日の14:00に実行
yearly();
毎年1月1日の00:00にタスク実行
yearlyOn(6, 1, '17:00');
毎年6月1日の17:00にタスク実行
timezone('America/New_York');
タスクのタイムゾーンを設定

④まとめ
このようにLaravelでは、スケジュール機能にてcron機能を実装することができます。
とても便利な機能なので、ぜひ使用してみてはいかがでしょうか。