Vapor Trail

明るく楽しく元気よく

PHP プロセスの多重起動を防ぐやり方

cronでPHPのタスクを定期的に起動したいが、すでにプロセスが動いている場合に起動しないようにしたい。

  • PHPのタスクを実行する前に確認するタイプ
<?php
    /**
     * @param $process_command
     * @return bool
     */
    public function checkDoubleProcess(string $process_command): bool
    {
        $output = [];
        exec("ps aux | grep -E \"{$process_command}$\" | grep -v sudo | grep -v grep", $output);
        return count($output) >= 2;
    }

    /**
     * 動かしたいタスク
     */
    public function task()
    {
        //はじめにすでに起動していないかチェック
        if ($this->checkDoubleProcess("bash")) {
            exit;
        }

        //処理したい内容
    }

こんな感じで、プロセス名に一致するものが返ってくるので数を数えているだけ。

<?php
Array
(
    [0] => user   1161  0.0  0.2 115712  2312 pts/0    Ss   19:28   0:00 -bash
)
  • cronでlockファイルを作って多重起動を防ぐタイプ
0 * * * * apache /usr/bin/flock -n /tmp/process.lock php /src/task.php

今までわざわざ前者でやってたけど、crontabに書いたほうが楽だった