У меня есть скрипт index.php
который я использую в качестве URL-адреса после фиксации на сайте Google Code. Этот скрипт клонирует каталог и создает проект, который может занять некоторую работу. Я хочу, чтобы этот скрипт работал более одного раза параллельно.
Есть ли механизм, который я могу использовать, чтобы избежать выполнения этого скрипта, если другой уже находится в сеансе?
Вы можете использовать flock с LOCK_EX
чтобы получить эксклюзивную блокировку файла.
Например:
<?php $fp = fopen('/tmp/php-commit.lock', 'r+'); if (!flock($fp, LOCK_EX | LOCK_NB)) { exit; } // ... do stuff fclose($fp); ?>
Для версий PHP после 5.3.2 вам необходимо вручную освободить блокировку с помощью flock ($ fp, LOCK_UN);
Только если вы сохраните состояние запущенного скрипта и проверьте, когда запускается скрипт, если в настоящий момент активен другой скрипт.
Например, чтобы сохранить, если скрипт запущен, вы можете сделать что-то вроде этого:
$state = file_get_contents('state.txt'); if (!$state) { file_put_contents('state.txt', 'RUNNING, started at '.time()); // Do your stuff here... // When your stuff is finished, empty file file_put_contents('state.txt', ''); }
сколько времени требуется для запуска.
может использовать memcache
<?php $m = new Memcache(); // check the constructor call if( $m->get( 'job_running' ) ) exit; else $m->set( 'job_running', true ); //index code here //at the end of the script $m->delete( 'job_running' ); ?>
Если задача завершится неудачно, вам нужно будет удалить из memcache. Flock – тоже хороший вариант … возможно, на самом деле лучше.