php stream_copy_to_stream()/ fwrite()“资源暂时不可用”

时间:2016-07-16 05:53:49

标签: php smtp

现在,在你把我送到谷歌之前,我已经花了很多时间在这个问题上......

以下是该方案:

客户端:SMTP服务器发送带有1MB附件的电子邮件

中间人:PHP代理脚本(https://codereview.stackexchange.com/questions/134880/simple-tcp-proxy

目标:接受和处理SMTP连接/命令的PHP脚本

发生的情况是,客户端发送SMTP数据,直到“DATA”命令,Destination接受该命令而没有来自代理的任何错误。在“DATA”命令期间,当客户端传递邮件数据时,这很开心:

PHP Notice: stream_copy_to_stream(): send of 8192 bytes failed with errno=11 Resource temporarily unavailable in /root/proxy.php on line 59 (这发生在代理脚本上)

第59行在上述通知中提到:

stream_copy_to_stream($client, $dest)$client引用客户端SMTP服务器,$dest引用目标PHP脚本)

认为这是关于客户端尝试将数据写入目的地时目的地正忙,但是它可能会忙什么呢?客户端尝试写入时,目标是否仍然从代理流中读取数据?这会导致这个错误吗?究竟发生了什么?

如果除上述代理代码之外还需要任何代码,请告知我们,我将更新此帖子。

1 个答案:

答案 0 :(得分:0)

经过严格的测试,我自己找到了解决方案。通过设置代码的方式,只有一个stream_select()功能阻止并等待$client流提供读取的数据。问题是我没有包含第二个stream_select()来阻止,直到目标流可写为止。

实质上,以下代码100%工作:

--- snip ---

stream_select($r_sockets, $w = NULL, $e = NULL, NULL);
stream_select($r = NULL, $w_sockets, $e = NULL, NULL);

in_array($client, $r_sockets) && in_array($dest, $w_sockets) ?
    stream_copy_to_stream($client, $dest, 1024):
    stream_copy_to_stream($dest, $client, 1024);

1024作为stream_copy_to_stream()的第3个参数是允许数据以稳定的速度流动的内容,而不是将$client中的过多数据复制到$dest并导致错误。