Un modo è quello di utilizzare la funzione php gregge con un file fittizio, che agirà come un cane da guardia.
Sulla all'inizio del nostro lavoro, se il file di sollevare un LOCK_EX bandiera, di uscita, o aspettare, può essere fatto.
Php documentazione gregge: http://php.net/manual/en/function.flock.php
Per questo esempio, un file denominato lock.txt deve essere creato prima.
Esempio 1, se un altro processo gemello è in esecuzione, uscirà correttamente, senza riprovare, fornendo un messaggio di stato.
Genera lo stato di errore, se il file lock.txt non è raggiungibile.
<?php
$fp = fopen("lock.txt", "r+");
if (!flock($fp, LOCK_EX|LOCK_NB, $blocked)) {
if ($blocked) {
// another process holds the lock
echo "Couldn't get the lock! Other script in run!\n";
}
else {
// couldn't lock for another reason, e.g. no such file
echo "Error! Nothing done.";
}
}
else {
// lock obtained
ftruncate($fp, 0); // truncate file
// Your job here
echo "Job running!\n";
// Leave a breathe
sleep(3);
fflush($fp); // flush output before releasing the lock
flock($fp, LOCK_UN); // release the lock
}
fclose($fp); // Empty memory
Esempio 2, ci vuole il processo di aspettare, per un'esecuzione dopo la coda, se del caso:
<?php
$fp = fopen("lock.txt", "r+");
if (flock($fp, LOCK_EX)) { // acquire an exclusive lock
ftruncate($fp, 0); // truncate file
// Your job here
echo "Job running!\n";
// Leave a breathe
sleep(3);
fflush($fp); // flush output before releasing the lock
flock($fp, LOCK_UN); // release the lock
}
fclose($fp);
E 'anche fattibile con fopen in modalità x, creando e cancellando un file al termine dello script.
Creare e aprire solo per scrittura; posiziona il puntatore del file all'inizio del file . Se il file esiste già, i fopen() chiamano fallirà restituendo FALSE
http://php.net/manual/en/function.fopen.php
è lo script in esecuzione in un server web, o riga di comando? –
Se è davvero importante ... web server. –
probabilmente un blocco mysql, in tal caso, quindi lo script può abortire e pronunciare "alread in use". usare flock e simili bloccherebbe lo script da Apache stesso e probabilmente causerebbe 500 errori interni e quant'altro. –