2015-06-20 39 views
35

我的Gmail中有2465封電子郵件,爲什麼下載所有電子郵件後程序無法停止?所有的code1和code2都以命令行模式運行。
代碼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; 
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"; 
?> 

對於代碼1:
1.可下載的所有電子郵件。
2.在控制檯上輸出2465
3.no over在控制檯上輸出。
4.程序不能停止,似乎永遠運行。

碼2:

<?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"; 
?> 

對於代碼2:
1.可下載的所有電子郵件。
2.在控制檯上輸出2465。
3.在控制檯上輸出over
4.下載完所有電子郵件後程序停止。

代碼2中有一行echo $email_id.PHP_EOL;多於代碼1,其他代碼相同。
所有的code1和code2都在命令行模式下運行。
誰能解釋一下?

enter image description here

+1

你說它什麼都不做就掛了?只要CPU不是100%,它可能會掛在一些系統調用中,然後嘗試一個「strace」,然後查看最後的系統調用是什麼。 – bwoebi

+0

使用** imap_timeout嘗試設置超時獲取電子郵件** - 您的回聲可能會意外地使第二個腳本超時。 – Jehy

+0

你還能重現錯誤嗎?如果是的話,你在執行腳本時使用了哪些PHP版本以及你在使用什麼shell? – cb0

回答

0

檢查imap_fetchbody()功能,該功能允許您設置下載限制以及與此可以將所有郵件下載後停止。檢查下面的代碼,我對代碼進行了一些更改,以便在所有郵件下載後停止下載過程。請檢查一次。

<?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"; 
?> 

並查看結果!

我將imap_search()替換成imap_fetch_overview()並作了一些相關更改。

讓我知道是否需要任何進一步的幫助。

+0

我測試了各種狀態。 –

+0

所有的代碼,我的代碼1代碼2和 AddWeb Solution Pvt Ltd的代碼可以用putty運行來連接我的vps,並且在命令行模式和瀏覽器模式下獲得所有相同的結果。本地操作系統是Windows,服務器操作系統是debian7。 –

+0

本地操作系統是debian7,服務器操作系統是debian7,我的代碼1運行在瀏覽器模式下,得到想要的結果。當我的代碼1在命令行模式下運行時,無法停止下載所有電子郵件。 –

1

嘗試

print imap_last_error(); 

之前和之後imap_close更多地瞭解是什麼原因導致你的問題

-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 
?> 

我已經重置郵件變量。

+0

問題的關鍵在於它永遠不會離開foreach循環。 – miken32

相關問題