PHPでオフラインタスクキューを実装しています。オンラインページは、作業をスケジュールするためにこのテーブルにレコードを挿入します。
create table sl_task_queue (
task_id int primary key auto_increment,
task_data varchar(255) not null,
started_date datetime,
completed_date datetime,
priority int not null default 10
) ENGINE=Innodb;
次に、オフラインで、作業の実行を待機するループ内にあるPHPCLIプロセスのプールがあります。作業を照会するには、次の関数を実行します。
$SEMKey = "849039";
$seg = sem_get( $SEMKey, 2, 0666, -1) ;
function getTask() {
sem_acquire($GLOBALS['seg']);
// This function returns null for no results, or a Task ORM object on success
$Task = eSqlObject("Task", "select * from sl_task_queue
where started_date is null
order by task_id asc limit 1 for update");
if( $Task ) {
// Set started_date to claim this task
$Task = new LucidityTask($hash);
$Task['started_date'] = date("Ymd H:i:s");
$Task->save(); // performs an UPDATE query
}
sem_release($GLOBALS['seg']);
return $Task;
}
ここでは、PHPセマフォとMySQLの「SELECT...FORUPDATE」機能の2つを試しました。完全なLOCKTABLEコマンドも試しました。それにもかかわらず、デーモン内の2つのプロセスが同じ行を要求するという問題があり、その理由を特定できません。いくつかの疑い-別々のCLIプロセスを実行すると、PHPのセマフォはderpモードになりますか?または、MySQLは、基になるテーブルデータを実際に更新するために時間を取っているので、この関数が終了した後も、SELECTクエリはしばらくの間古いデータを返しますか?
他のアイデアはありますか?
本当にありがとう!