现在,在你把我送到谷歌之前,我已经花了很多时间在这个问题上......
以下是该方案:
客户端: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脚本)
我认为这是关于客户端尝试将数据写入目的地时目的地正忙,但是它可能会忙什么呢?客户端尝试写入时,目标是否仍然从代理流中读取数据?这会导致这个错误吗?究竟发生了什么?
如果除上述代理代码之外还需要任何代码,请告知我们,我将更新此帖子。
答案 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
并导致错误。