2010-03-04 7 views
12

Ho due motivi per utilizzare una funzione di sospensione: in primo luogo, per inviare automaticamente un'email di conferma ad un cliente 20 minuti dopo che ci hanno contattato. Non voglio usare cron job perché voglio che siano esattamente 20 minuti (e sono stufo del mio server web che mi invia e-mail dicendomi che hanno avviato un cron job ..... una nuova email ogni 20 minuti!)La funzione sleep utilizza le risorse del server?

Secondo motivo: ho sentito parlare di persone che inviano email di massa utilizzando la funzione sleep. Dato che il mio server consentirà solo 100 email all'ora, voglio usare la funzione sleep per far sì che lo script vada in pausa per un'ora, quindi continuare dove è stato rilevato.

La mia domanda è questa: usa le risorse del server? Rallenterà le cose? Ci sono altri problemi con l'uso della funzione sleep? Grazie in anticipo!

risposta

13

Mentre un processo è sleep, non consumerà tempo di CPU, ma il set di lavoro del processo richiede comunque memoria fisica e/o file di paging per supportare tale processo. In altre parole, il processo dell'interprete PHP deve continuare a funzionare. Finché il tuo server ha abbastanza RAM questo non dovrebbe essere un problema.

+0

Quindi, se il mio servizio di hosting è affidabile (ad esempio, godaddy), probabilmente non dovrò preoccuparmi dei problemi di RAM? Grazie per l'aiuto! – Dustin

+9

Non è una buona idea usare la funzione sleep nello script del serveride di PHP. Stai sprecando un thread del webserver mentre stai dormendo. Inoltre, se si dorme troppo a lungo, il server bloccherà il processo come bloccato o il browser dell'utente scadrà e arriverà. Il modo corretto per farlo è con il cronjob o con un processo autonomo. – Vlad

+4

Ti apriresti anche tu ad un banale attacco DoS. Qualche idiota potrebbe registrare un paio di account nel corso di un minuto, e i thread apache dormenti mangeranno tutta la tua memoria. –

8

I tempi di consegna delle email sono piuttosto variabili, quindi non riceverai un'email nella posta in arrivo di qualcuno esattamente in 20 minuti, indipendentemente da ciò che fai.

Io uso uno script di background di lunga durata, lanciato dalla CLI, anziché Apache, per gestire l'invio di e-mail. La mia applicazione scarica le e-mail in una tabella delle code, che lo script del mailer esegue il polling ogni 15 secondi. Dorme() s tra i sondaggi. In questo modo, ho solo uno script che tenta di connettersi al server SMTP e dormire.

Questa parte dell'applicazione è stata eseguita correttamente senza problemi importanti negli ultimi 2 anni. L'unico fastidio è mantenere la sceneggiatura in esecuzione - se scende per qualsiasi motivo, la posta non esce finché non la si riattiva. Ma nel peggiore dei casi, potresti semplicemente riavviarlo tramite cron periodicamente, ad es. quotidiano.

Se dovessi affrontare il tuo problema, avrei semplicemente messo una colonna "Invia ora" sul tavolo della coda, e la data a 20 minuti per queste e-mail. Il mailer sarebbe quindi SELECT * FROM mail_queue WHERE send_time <= NOW()

In alternativa, è possibile utilizzare un jobcoue reale come beanstalkd. Ho scelto la tabella delle code esclusivamente per mantenere il mio stack di applicazioni semplice.

-1
sleep(); 

Sì, il sonno utilizza le risorse del server.

Sì, rallenta quando si imposta il sonno (...).

Ci sono altri problemi quando si utilizza "sleep".

qualcuno in this page dice

Ricordati che il sonno() significa "lasciare che il tempo di PHP per fare altre cose". Ciò significa che sleep() può essere interrotto dai segnali. Questo è importante se lavori con pcntl_signal() e gli amici.

-1

Invece del server SLEEP, ad es.sleep(3);

ho usato il sonno "client-side" utilizzando Javascript:

if (empty($_COOKIE['my_Timer'])) {die('<script>window.setTimeout(\'window.location="'.$_SERVER['REQUEST_URI'].'"; \',3000);</script>');} 
setcookie('my_Timer', "blabla", time()+999999, '/'); 
0

so che è un filo molto vecchio, ma alcune persone potrebbero incontrare, ecco un altro suggerimento.

Questo funziona solo se:

  • Siete sul server linux
  • È possibile eseguire i comandi (come exec, alcuni hosting condiviso non permetterà che)

invece di dormire per molto tempo, che ritengo sia una cattiva pratica (per questo scenario), potresti prendere in considerazione il comando at per questo.

Mentre cron job è ideale per le cose ripetitive se si desidera eseguire un comando solo una volta in un momento prestabilito in futuro, at è il tuo migliore amico.

Questo è il modo in cui sto pianificando le e-mail da inviare X tempo dopo l'interazione dell'utente con la pagina web.

Esempio:

$wait_time=time()+mt_rand(3600,36000); 
//wait a random amount of time between 1 and 10 hours 
//$wait_time=time()+1200 -if you want 20 minutes exactly. 
$cmd_string=escapeshellcmd('php /path/to/script.php '.$par1.' '.$par2.' "'.$par3.'" '.$parX); 
exec("echo -e '$cmd_string' | at ".date("Hi M d",$wait_time)); 

Che si crea uno script.php che gestisce tutti i parametri passati e fare quello che vuoi fare.

Problemi correlati