2015-06-20 20 views
35

Ci sono 2465 e-mail nella mia gmail, perché il programma non può fermarsi dopo aver scaricato tutte le e-mail? Tutti i codici 1 e 2 sono eseguiti in modalità riga di comando.
code1:perché il programma non può fermarsi dopo aver scaricato tutte le e-mail?

<?php 
$mailbox = array(
    'mailbox' => '{imap.gmail.com:993/imap/ssl}INBOX', 
    'username' => '[email protected]', 
    'password' => 'yyyy' 
); 

$stream = imap_open($mailbox['mailbox'], $mailbox['username'], $mailbox['password']) 
    or die('Cannot connect to mailbox: ' . imap_last_error()); 
$emails = imap_search($stream,"ALL"); 
$nums=imap_num_msg($stream); 
echo $nums; 
foreach($emails as $email_id) { 

      $mime = imap_fetchbody($stream, $email_id, ""); 
      file_put_contents("/tmp/" . "email_{$email_id}.eml", $mime); 
     } 

imap_close($stream); 
echo "over"; 
?> 

Per code1:
1.can scaricare tutti i messaggi di posta elettronica.
2. uscita 2465 sulla console
3.no over output sulla console.
4. il programma non può fermarsi, sembra funzionare per sempre.

Codice2:

<?php 
$mailbox = array(
    'mailbox' => '{imap.gmail.com:993/imap/ssl}INBOX', 
    'username' => '[email protected]', 
    'password' => 'yyyy' 
); 

$stream = imap_open($mailbox['mailbox'], $mailbox['username'], $mailbox['password']) 
    or die('Cannot connect to mailbox: ' . imap_last_error()); 
$emails = imap_search($stream,"ALL"); 
$nums=imap_num_msg($stream); 
echo $nums; 
foreach($emails as $email_id) { 
      echo $email_id.PHP_EOL; 
      $mime = imap_fetchbody($stream, $email_id, ""); 
      file_put_contents("/tmp/" . "email_{$email_id}.eml", $mime); 
     } 

imap_close($stream); 
echo "over"; 
?> 

Per Codice2:
1.can scaricare tutti i messaggi di posta elettronica.
2. uscita 2465 sulla console.
3. over output sulla console.
4. il programma si ferma dopo aver scaricato tutte le e-mail.

C'è una riga echo $email_id.PHP_EOL; in code2 più di codice1, altri codici sono uguali.
Tutti i codici 1 e 2 vengono eseguiti in modalità riga di comando.
Chi può spiegarlo?

enter image description here

+1

Hai detto che si blocca senza fare nulla? Finché la CPU non è al 100%, probabilmente si blocca in alcuni syscall, ... prova un 'strace' e poi guarda quali sono gli ultimi syscall. – bwoebi

+0

Prova il timeout delle impostazioni per il recupero dell'e-mail con ** imap_timeout ** - l'eco può accidentalmente rendere questo timeout per il secondo script. – Jehy

+0

È ancora possibile riprodurre l'errore? Se sì, quale versione di php stai usando e quale shell stai usando mentre esegui gli script? – cb0

risposta

0

funzione Controllo imap_fetchbody(), questa funzione permette di impostare limite di download e con questo si può fermare dopo tutti i download di posta elettronica. Controlla sotto il codice, ho apportato alcune modifiche al tuo codice che interromperà il processo di download dopo che tutte le mail saranno scaricate. Si prega di controllare una volta.

<?php 
$mailbox = array(
    'mailbox' => '{imap.gmail.com:993/imap/ssl}INBOX', 
    'username' => '[email protected]', 
    'password' => 'yyyy' 
); 

$stream = imap_open($mailbox['mailbox'], $mailbox['username'], $mailbox['password']) 
    or die('Cannot connect to mailbox: ' . imap_last_error()); 

//Check all mails... 
$imap_obj = imap_check($stream); 

// Fetch an overview for all messages in INBOX... 
$nums=imap_num_msg($stream); 
$emails = imap_fetch_overview($stream,"1:{$imap_obj->Nmsgs}",0); 

echo $nums; 
//Loop until mail data... 
foreach($emails as $objEmail_data) { 
    $mime = imap_fetchbody($stream, $objEmail_data->msgno, ""); 
    file_put_contents("/tmp/" . "email_{$objEmail_data->msgno}.eml", $mime); 
} 

imap_close($stream); 
echo "over"; 
?> 

E vedere i risultati!

Ho sostituito imap_search() con imap_fetch_overview() e apportato alcune modifiche rilevanti.

Fammi sapere se è necessario ulteriore aiuto.

+0

ho testato ogni tipo di stato. –

+0

tutto il codice, my code1 code2 e AddWeb Solution Il codice Pvt Ltd può essere eseguito con stucco per connettere il mio vps e ottenere lo stesso risultato sia in modalità riga di comando che in modalità browser. il sistema operativo locale è Windows, il sistema operativo del server è debian7. –

+0

local os è debian7, server os è debian7, my code1 viene eseguito in modalità browser, ottiene il risultato desiderato.quando il mio code1 viene eseguito in modalità riga di comando, non può fermarsi dopo aver scaricato tutte le e-mail. –

1

Prova

print imap_last_error(); 

Prima e dopo imap_close sapere di più su ciò che provoca il problema

-1
<?php 
$mailbox = array(
    'mailbox' => '{imap.gmail.com:993/imap/ssl}INBOX', 
    'username' => '[email protected]', 
    'password' => 'yyyy' 
); 

$stream = imap_open($mailbox['mailbox'], $mailbox['username'], $mailbox['password']) 
    or die('Cannot connect to mailbox: ' . imap_last_error()); 
$emails = imap_search($stream,"ALL"); 
$nums=imap_num_msg($stream); 
//echo $nums; // removed this 
foreach($emails as $email_id) { 

      $mime = imap_fetchbody($stream, $email_id, ""); 
      file_put_contents("/tmp/" . "email_{$email_id}.eml", $mime); 
     } 
unset($emails); // added this 
imap_close($stream); 
die ("over"); // changed this 
?> 

Ho ripristinato le variabili email.

+0

L'intero punto della domanda è che non lascia mai il ciclo 'foreach'. – miken32