Как я могу убедиться, что у меня есть только один экземпляр PHP-скрипта, запущенного через Apache?

У меня есть скрипт 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 – тоже хороший вариант … возможно, на самом деле лучше.