나는 Windows 서버뿐만 아니라 리눅스에서도 실행해야하는 PHP 스크립트를 가지고 있습니다. 두 환경에서 수정하지 않고 동일한 스크립트를 사용하고 싶습니다.스크립트의 배수 인스턴스를 방지하는 방법은 무엇입니까?
논문 스크립트 (리눅스에서) 및 Windows 스케줄러와 크론으로 예약됩니다 내 Windows 환경 (또는 다른, 나는 지금 걱정하지 않는다).
그러나 일부 스크립트는 완료하는 데 몇 분이 걸릴 수 있습니다. 나는 그것이 실행 된 마지막 시간이 끝나기 전에 동일한 스크립트가 스케줄러 (cron 또는 windows의 것)에 의해 시작되는 것을 막고 싶다.
어떻게 해야할지 모르겠다. 실행 중에 문제가 발생하면 "잠금"이 해제되므로 다음에 사람이 개입하지 않아도 다시 실행됩니다.
어쩌면 트릭을 할 것 더미 파일의 무리와 함께,하지만 할 방법을 모르겠어요.
또한이 서버에는 MySQL 데이터베이스가 있습니다. 데이터베이스 쪽에서 자물쇠를 사용하는 것 같습니다.
1- Start a transaction
2- Insert script name in a table.
3- execution of the script.
4- If successful then delete the row and commit the transaction or simply rollback;
스크립트 이름이 테이블에 있으면 실행되지 않을 수 있습니다. 스크립트 실행이 실패하면 다음 번에 스크립트가 호출 될 때 행이 표시되지 않도록 MySQL이 자동으로 트랜잭션을 롤백합니다.
하지만, 트랜잭션에 다른 연결이 미트되지 않은 데이터를 볼 수있는 방법이있다? 그렇다면 어떻게? 나는 또한 롤백 일을 사용하는 것은 불가능합니다 경우 행에 대한 잠금을 사용하여 생각
..
1- Insert script name in a table if it doesn't already exists.
2- Start a transaction.
2- Select * from Table where script_name FOR UPDATE.
3- execution of the script.
4- If successful then release the lock (rollback or commit).
그러나 여기 내 큰 문제는 MySQL과입니다. 이전 잠금이 해제되거나 50 초의 시간 초과 (innodb_lock_wait_timeout 변수)가 경과 할 때까지 FOR UPDATE hang을 선택하십시오. MySQL이 전체 데이터베이스에 영향을 미치지 않고 내 행이 잠겨 있다는 것을 바로 알려주고 싶습니다. 이는 innodb_lock_wait_timeout 변수가 글로벌 변수 (세션이 아닌)이기 때문입니다. Oracle에서 사용할 수있는 NO_WAIT 절을 모방하는 다른 변수가 있습니까?
또는 스크립트를 아무런 문제없이 50 초 동안 멈춰야합니까? 나는 PHP는 초보자와 나는 서버에 문제가 발생하지 않는 한
는에 가장 좋은 방법은 무엇이다.
아마 나는 보지 못했다 다른 옵션 .. 잠금 파일에 대한
어떤 경우에도 MySQL 데이터베이스를 사용하는 스크립트가 있습니까? 아니면 다른 자원들? – VolkerK
그들 중 일부는, 일부는하지 않습니다 ... Theses 스크립트는 구성 할 수 있으며 모든 theses 스크립트가 상속하는 기본 클래스에 잠금을 구현하고 싶습니다. 따라서 데이터베이스 사용이 가능합니다. – Pmax