데이터베이스에서 행을 검색 한 다음 내용을 기반으로 작업을 수행하는 PHP 스크립트가 있습니다. 이 작업은 시간 소모적 일 수 있지만 (반드시 계산 비싼 것은 아닙니다) 여러 스크립트를 동시에 실행할 수 있어야합니다.PHP와 MySQL을 사용하여 간단한 대기열을 구현 하시겠습니까?
이+---------------------+---------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+---------------+------+-----+---------------------+----------------+
| id | bigint(11) | NO | PRI | NULL | auto_increment |
.....
| date_update_started | datetime | NO | | 0000-00-00 00:00:00 | |
| date_last_updated | datetime | NO | | 0000-00-00 00:00:00 | |
+---------------------+---------------+------+-----+---------------------+----------------+
내 스크립트가 현재 (작업이 완료되면 업데이트됩니다) 및 date_update_started
를 사용하지 않는 date_last_updated
에서 가장 오래된 날짜와 행을 선택 :
데이터베이스의 행은 다음과 같이 보인다.
스크립트의 여러 인스턴스를 지금 병렬로 실행하려면 동일한 행 (적어도 일부 시간)을 선택하면 중복 작업이 수행됩니다.
내가 생각하고있는 것은 트랜잭션을 사용하여 행을 선택하고 date_update_started
열을 업데이트 한 다음 date_update_started
보다 큰 행을 선택하는 행을 선택하는 SQL 문에 WHERE
조건을 추가하는 것입니다. 다른 스크립트가 작동하지 않는지 확인하십시오). 예 :
$sth = $dbh->prepare('
START TRANSACTION;
SELECT * FROM table WHERE date_update_started > 1 DAY ORDER BY date_last_updated LIMIT 1000;
UPDATE table DAY SET date_update_started = UTC_TIMESTAMP() WHERE id IN (SELECT id FROM table WHERE date_update_started > 1 DAY ORDER BY date_last_updated LIMIT 1000;);
COMMIT;
');
$sth->execute(); // in real code some values will be bound
$rows = $sth->fetchAll(PDO::FETCH_ASSOC);
필자가 읽은 바로는 이것은 본질적으로 대기열 구현이며 MySQL에서 눈살을 찌푸린 것처럼 보입니다. 마찬가지로, 여러 스크립트를 병렬로 실행할 수있는 방법을 찾아야하며이 작업을 수행 한 후에 필자가 생각해 냈습니다.
이러한 접근 방식이 효과가 있습니까? 더 좋은 방법이 있습니까?
어떻게 병렬 스크립트를 실행합니까? – Lupin
@Lupin 현재 스크립트는 cron 작업을 통해 매 15 분마다 실행 중입니다. 스크립트는 다른 인스턴스가 실행 중인지 확인한 후 종료됩니다. 아직 여러 스크립트를 관리하는 방법을 모르겠습니다. 데이터베이스에 카운터가있어 인스턴스의 수를 제한하고 인스턴스 수를 제한 할 수 있지만 한 번에 하나의 문제가 발생할 수 있습니다. – Nate
OK , 나를 완전히 이해할 수있는 몇 가지 추가 질문 : 1. 행을 선택하여 작업하고 DB로 다시 업데이트하는 스크립트가 있습니까? 2. 병렬 스크립트를 실행하고 다른 행에서 동일한 작업을 수행하고 싶습니다. 3. 스크립트가 실행될 때마다 선택한 행이 연속적입니까? 즉 1-100, 101-200 등입니까? 아니면 id가 임의로 지정되어 있으며 date_update_started가 1보다 큰 행만 선택됩니까? – Lupin