2016-07-16 144 views
0

現在你給我關到谷歌,我已經花了大量的時間在這個問題上...之前PHP stream_copy_to_stream()/ fwrite()將「資源暫時不可用」

這裏的情景:

客戶:SMTP服務器帶1MB附件發送電子郵件

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

目的地:PHP腳本接受和處理SMTP連接/命令

發生什麼事是,客戶端發送SMTP數據直到目標接受的「DATA」命令沒有任何錯誤代理。在 「DATA」 的命令,當客戶端傳送郵件數據,這happpens:

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腳本)

認爲這是關於客戶端試圖將數據寫入到目的地作爲目的地Ination正在忙碌,但它可能忙於什麼?當客戶端嘗試寫入數據時,目標是否仍然從代理的流中讀取數據?會導致這個錯誤?究竟發生了什麼?

如果除了上面的代理代碼之外還需要其他代碼,請讓我知道,我會更新這篇文章。

回答

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); 

1024stream_copy_to_stream()第三個參數就是允許數據以穩定的速度流動,而不是從$client複製數據太多,到$dest並導致錯誤。

相關問題