2012-06-09 16 views
5

Ho una pagina php che deve scrivere su un database a volte all'inizio dello script.PHP: ignora MySql Query se richiede più tempo di un secondo

Durante un backup mysqldump pianificato, la pagina non è accessibile, perché sta tentando di scrivere su una tabella bloccata.

Durante il blocco, MySql accoda gli aggiornamenti SQL e, una volta completato il backup, vengono eseguiti come desiderato. Tuttavia la mia pagina php non verrà visualizzata fino al completamento del backup.

Tuttavia, poiché gli aggiornamenti non restituiscono nulla allo script, vorrei che non avrebbero bloccato il mio script durante il blocco; Spero che ci sia un modo in cui posso dire a php di inviare l'aggiornamento sql a mysql e non preoccuparti della conferma che l'aggiornamento è stato completato.

Voglio che php invii la query a mysql e quindi continui semplicemente sulla riga successiva di php se l'aggiornamento non viene completato in un secondo.

Sto eseguendo php su un server Windows, quindi capisco che un certo tipo di thread non è un'opzione.

Se c'è un modo per impostare un timeout su quella query (nello specifico), ciò potrebbe essere l'ideale, ma non voglio rinominare l'aggiornamento sql del tutto se scade. Voglio comunque che MySQL lo elabori dopo che il blocco è scomparso.

Cosa raccomanderesti (dato che rimuovere gli aggiornamenti sql del tutto non è un'opzione)?

+0

Non possibile. PHP non ha alcun controllo sulla meccanica delle chiamate di query. PHP non è threadato, indipendentemente dal sistema operativo su cui è in esecuzione. –

+0

Se PHP ha qualche tipo di funzione di timeout che potrebbe incapsulare qualsiasi altra chiamata di funzione mentre si posiziona un timeout sulla funzione incapsulata, sarebbe tecnicamente multithreading? –

+0

No. PHP non supporta il threading e molto probabilmente non diventerà mai multithread senza una riscrittura fondamentale dell'intera lingua, ad es. PHP v6. La maggior parte delle librerie di base PHP non sono thread-safe. –

risposta

3

Per gli altri che possono imbattersi in questo thread, alla fine ho scritto questa funzione per rilevare se il tavolo è bloccato, e fare solo il aggiornamenti di SQL se è NON bloccato:

function isLocked($databaseName,$tableName) 
    { 
     $sql = "show open tables from `".$databaseName."` where `table`=`".tableName."` and In_use > 0;"; 
     $result = @mysql_query($sql); 
     if (mysql_num_rows($result) != 0) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

(nota: Questo divertente ction presuppone che la connessione al database sia già stabilita)

Questo funziona, perché ho modificato il codice in modo che gli aggiornamenti di SQL verranno ultimati alla prossima volta che la pagina viene caricata senza un blocco in posizione.

3

Una soluzione, utilizzando PDO, avvia una connessione con timeout, inizia una transazione e, in caso di blocco, il timeout chiuderà la connessione e verrà ripristinato.

Per timeout in PDO, per utilizzare PDO :: ATTR_TIMEOUT.

1

Credo che l'unico modo per farlo, si è diviso di script in pezzi e utilizzando chiamate Ajax, è possibile inviare la grande aggiornamento e continuare con il resto dello script che non dipende in questo processo, se tutto lo script dipende dal risultato dell'aggiornamento, l'unico modo è fare un buon caricamento ...

+0

Questa è una buona idea, ma ho bisogno che questi aggiornamenti SQL avvengano, anche se l'utente non ha javascript abilitato. –

Problemi correlati