为什么程序在下载完所有电子邮件后无法停止?

在我的Gmail中有2465封电子邮件,为什么下载所有电子邮件后程序无法停止? 所有的code1和code2都以命令行模式运行。
代码1:

<?php $mailbox = array( 'mailbox' => '{imap.gmail.com:993/imap/ssl}INBOX', 'username' => 'xxxx@gmail.com', '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"; ?> 

对于code1:
1.可以下载所有的电子邮件。
2.在控制台上输出2465
3.不要over控制台over输出。
程序不能停下来,似乎永远在运行。

码2:

 <?php $mailbox = array( 'mailbox' => '{imap.gmail.com:993/imap/ssl}INBOX', 'username' => 'xxxx@gmail.com', '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控制台over输出。
4.下载完所有电子邮件后,程序停止。

有一行echo $email_id.PHP_EOL; 在代码2中多于代码1,其他代码相同。
所有的code1和code2都以命令行模式运行。
谁能解释一下?

在这里输入图像说明

尝试

 print imap_last_error(); 

imap_close之前和之后,更多地了解导致问题的原因

检查imap_fetchbody()函数,这个函数允许你设置下载限制,用这个你可以在所有邮件下载后停止。 检查下面的代码,我做了一些更改到您的代码,将停止所有邮件下载后的下载过程。 请检查一次。

 <?php $mailbox = array( 'mailbox' => '{imap.gmail.com:993/imap/ssl}INBOX', 'username' => 'xxxx@gmail.com', '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()replace了imap_fetch_overview()并做了一些相关的修改。

让我知道是否需要进一步的帮助。

 <?php $mailbox = array( 'mailbox' => '{imap.gmail.com:993/imap/ssl}INBOX', 'username' => 'xxxx@gmail.com', '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 ?> 

我已经重置了电子邮件variables。