Сделал как раз с помощью метки времени.
Вот собственно код этой части:
function myFunc(){
if(!file_exists("temp/lock.txt")) file_put_contents("temp/lock.txt", "unlock\r\n".time());
$lockData=file("temp/lock.txt");
if(trim($lockData[0])=="lock") if(time()-(int)$lockData[1]<=4) die('will_not_pass');
file_put_contents("temp/lock.txt", "lock\r\n".time());
file_put_contents("temp/lock.txt", "unlock\r\n".time());
return myFunc();
}
Теперь в случае повторного запуска скрипта, сначала проверяем, заперт ли файл
if(trim($lockData[0])=="lock")
потом проверяем сколько прошло времени с последнего запирания
if(time()-(int)$lockData[1]<=4)
и если файл заперт а время прошло менее 4 секунд - запрещаем данному скрипту выполняться.
Если же скрипт завершился из-за какой-то ошибки, типа превышение max_execution_time, а файл так и остался запертым - то на клиентской стороне стоит ява-скрипт, который с помощью ajax перезапускает его ч-з 5 секунд (от сюда и условие <=4 секунды). После нес-ких десятков тестов, скрипт ни разу не подвёл.