PHPのマルチプロセス処理を使ってタスクを処理する方法

PHP ではマルチプロセスを利用することで、処理を並行して実行して並行処理を実現できます。以下はその実装方法です。

  1. pcntl_fork() 関数を使って子プロセスを作成します。このとき、オリジナルのプロセスをメインプロセス、子プロセスをワーカープロセスと呼びます。メインプロセスはワーカープロセスの作成とワーカープロセスとの通信をパイプか共有メモリを使って行います。
  2. メインプロセスでpcntl_signal()を使用して、子プロセス終了時の信号の信号処理関数を登録する
  3. 具体的な要件に応じて、タスク処理のロジックを実装する。exec() 関数を利用して外部コマンドを実行したり、PHP コードを直接記述してタスクを処理したりすることが可能だ。
  4. メインプロセスはpcntl_waitpid()関数を使用して子プロセスの完了を待って、子プロセスの終了ステータスを取得します。
  5. 複数の処理プロセスを作成し、管理することで、同時並行に複数のタスクを実行することが可能となり、特定のニーズに応えることが可能となります。

以下は、マルチプロセスを利用したタスク処理の簡単な例です。

<?php
// 创建子进程
$pid = pcntl_fork();

if ($pid == -1) {
    // 创建失败
    die('Could not fork');
} elseif ($pid) {
    // 主进程
    // 注册信号处理器,处理子进程结束时的信号
    pcntl_signal(SIGCHLD, function ($signo) {
        while (pcntl_waitpid(-1, $status, WNOHANG) > 0) {
            // 子进程结束,获取子进程的退出状态
            $exitCode = pcntl_wexitstatus($status);
            echo "Child process exited with code $exitCode" . PHP_EOL;
        }
    });

    // 主进程继续执行其他任务
    // ...

    // 等待子进程结束
    while (true) {
        sleep(1);
    }
} else {
    // 子进程
    // 执行具体的任务处理逻辑
    // ...

    // 子进程处理完毕后退出
    exit(0);
}

マルチプロセス処理でタスクを処理する場合、プロセス間の同期と通信に注意して、データ競合やリソース競合の問題を回避する必要があります。同期と通信を実装するには、ミューテックス、セマフォ、共有メモリなどの仕組みを使用できます。

bannerAds