【发布时间】:2015-09-06 03:52:55
【问题描述】:
我的 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";
?>
对于代码 1:
1.可以下载所有邮件。
2.控制台输出2465
3.控制台没有over输出。
4.程序不能停止,它似乎永远运行。
代码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在控制台输出。
4.下载所有邮件后程序停止。
code2比code1多了一行echo $email_id.PHP_EOL;,其他代码相同。
所有 code1 和 code2 都在命令行模式下运行。
谁能解释一下?
【问题讨论】:
-
你说什么都不做就挂了?只要 CPU 不是 100%,它可能会挂在某个系统调用中……然后尝试
strace并查看最后一个系统调用是什么。 -
尝试设置超时以使用 imap_timeout 获取电子邮件 - 您的回声可能会意外地使第二个脚本超时。
-
你还能重现错误吗?如果是这样,您使用的是什么 php 版本,执行脚本时使用的是什么 shell?
-
您是否尝试打印
$emails数组或查看它的计数以确保其中没有任何空白条目? -
您如何连接到实际运行脚本的机器?如果它是远程的,则可能是 stdio(终端连接)上的不活动,同时它在远程计算机上获取和下载消息,超过了您的连接超时。考虑到在代码 2 中“结束”需要多长时间,您能否将单独的窗口连接到运行代码 1 的机器,并在相同的时间后查看进程是否实际上仍在运行。同样检查脚本时间限制,在 php_cli