[PHP]ロックファイルを使った排他制御

[PHP]ロックファイルを使った排他制御ASのおもちゃ箱開発ブログちょうど良いロックファイルを使った排他制御がなかったので、作ってみた。
APPPATHは定数なので、ご利用の環境に合わせて、書き換えてください。

<?php

class Filelock
{
    private $lock_file_dir = APPPATH . '/tmp/lock';

    function __construct(  ) {
       if(!file_exists($this->lock_file_dir)) {
           mkdir($this->lock_file_dir);
       }
    }

    public function get_path($process_name) {
        return $this->lock_file_dir."/".$process_name.'.lock';
    }

    public function create($process_name) {
        $fpath = $this->get_path($process_name);
        touch($fpath);

        $pid = getmypid();
        file_put_contents($fpath, $pid);
    }

    public function delete($process_name) {
        unlink($this->get_path($process_name));
    }

    public function check($process_name) {
        $path = $this->get_path($process_name);

        if (file_exists($path)) {
            $pid = file_get_contents($path);
            if (!self::exists_pid($pid)){
                self::delete($process_name);
                return true;
            } else {
                return false;
            }
        }
        return true;
    }

    public static function exists_pid ($pid) {
        if ($pid === '') {
            return true;
        }

        exec("ps {$pid} ", $_output, $_status);

        if($_status == 0 ) {
            return true;
        }

        return false;

    }
}

使い方

        // 同時実行防止チェック
        $key = basename(__FILE__);
        $filelock = new Filelock();
        if(!$filelock->check($key)) {
            echo "already running task. ".$key.PHP_EOL;
            exit(0);
        }
        $filelock->create($key);

        // 処理本体....

        // 同時実行防止ロックファイル解放
        $filelock->delete($key);

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>