カテゴリー別アーカイブ: PHP

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

ちょうど良いロックファイルを使った排他制御がなかったので、作ってみた。
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);

utf8_unicode_ci から utf8_general_ci への変換

MySQLのutf8_unicode_ci で格納されたデータを utf8_general_ci のテーブルへ格納する際の文字化けで躓く。
試行錯誤の末、utf8_general_ci側のデータベース接続後に、
mysql_query(“SET NAMES UTF8″)
であっさり、解決。

環境によっては、これでもうまくいかないかもしれないけど。
文字コードは深いので、一度ちゃんと勉強しないとなあ。