インターネットの急速な発展に伴い、一般的に使用されるバックエンド開発言語としての PHP は、同時実行性の高いシナリオで大量のリクエストに直面しています。リクエストのスケジューリングとタスクの割り当てをいかに効率的に実行するかが重要な課題となっています。この記事では、PHP の高同時実行環境での実践的な方法を共有し、対応するコード例を示します。
同時実行性の高いシナリオでは、プロセス管理とタスク キューが一般的な方法です。プロセス管理を通じて、同時プロセスの数を動的に調整して、システムの処理能力を向上させることができます。タスク キューは、タスクが順序どおりに実行されることを保証するルールに従ってリクエストを分散するために使用されます。
// プロセス管理クラスを作成します class ProcessManager {
プライベート $maxProcesses; // 同時にプロセスの最大数 private $runningProcesses = [];
パブリック関数 __construct($maxProcesses) {
$this->maxProcesses = $maxProcesses;
}
//新しいしいプロセスを作成 public function createProcess($task) {
$pid = pcntl_fork();
if ($pid == -1) {
die("フォークが失敗しました");
} elseif ($pid) { // 親プロセス $this->runningProcesses[$pid] = $task;
} else { // 子プロセス $task->run();
終了(0); //子プロセスを終了する}
// 同時にプロセスの最大数を追い越すえているかどうかを確認する if (count($this->runningProcesses) >= $this->maxProcesses) {
$this->waitForProcess();
}
}
// プロセスが終了するのを扱うちます public function waitForProcess() {
while (true) {
$pid = pcntl_wait($status);
if ($pid > 0) {
unset($this->runningProcesses[$pid]);
}
if (count($this->runningProcesses) < $this->maxProcesses) {
壊す;
}
}
}
}
//タスククラスを作成 class Task {
プライベート $taskId;
パブリック関数 __construct($taskId) {
$this->taskId = $taskId;
}
パブリック関数 run() {
//タスク実行ロジックは「タスク」をエコーします。 $this->taskId 。 " が実行中です\n";
}
}
//プロセス マネージャー インスタンスを作成し、同時にプロセスの最大数を 4 に設定します
$processManager = 新しいしい ProcessManager(4);
// 10 個人的なのタスクを作成し、プロセス マネージャーに追加します ($i = 1; $i <= 10; $i++) {
$task = 新しいしいタスク($i);
$processManager->createProcess($task);
}
// すべてのプロセスが終了するのを扱うちます $processManager->waitForProcess();
上記のコードでは、ProcessManager クラスはプロセスの作成と管理を担当し、Task クラスはタスク実行ロジックを定義します。メイン プログラムで同時プロセスの最大数を設定し、プロセス マネージャーにタスクを追加し、waitForProcess を通じてすべてのタスクが完了するのを待ちます。
メッセージ キューは、リクエストの分離と非同期処理を実現し、システムの同時実行能力を向上させる効果的なリクエスト スケジューリングおよびタスク割り当て方法です。 PHP で一般的に使用されるメッセージ キューの実装には、Redis、Beanstalkd などが含まれます。
// Redis サーバーに接続 $redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// キューへの参加リクエスト $task = [
'url' => 'http://example.com/api',
'params' => ['トークン' => 'XXXX'],
// ...
];
$redis->rPush('task_queue', json_encode($task));
// (true) の間デキューするリクエスト {
$taskJson = $redis->blPop('task_queue', 0)[1]; // デキューのブロック $task = json_decode($taskJson, true);
//タスク処理を実行する//...
}
この例では、rPush はリクエスト データをキューに入れるために使用され、blPop はタスクが順番に処理されるようにデキューをブロックするために使用されます。開発者はリクエストを解析し、処理ロジックで対応する操作を実行できます。
PHP の高同時実行環境では、プロセス管理とタスク キューまたはメッセージ キューを通じて、効率的なリクエストのスケジューリングとタスクの割り当てを実現できます。合理的なスケジューリング戦略により、システムの同時処理能力が向上し、安定した効率的なリクエスト応答が実現されます。キャッシュや負荷分散などのテクノロジーと組み合わせると、同時実行性の高い環境でのパフォーマンスをさらに最適化できます。