2016-07-16 10 views
0

今、あなたは、私がこの問題に多くの時間を費やしてきたGoogleに私をオフに送信する前に...PHP stream_copy_to_stream()/ fwriteの()「資源一時的に利用できない」

は、ここでのシナリオです:

クライアント:SMTPサーバー1MBの添付ファイル付きの電子メールを送信する

中東男性:PHPのプロキシスクリプト(https://codereview.stackexchange.com/questions/134880/simple-tcp-proxy

宛先:SMTP接続/コマンドを受け入れて処理するPHPスクリプト

クライアントは、宛先がプロキシからエラーなしで受け入れる「DATA」コマンドまでSMTPデータを送信します。クライアントがメールデータを配信されたときに "DATA" コマンドの間に、これはhapppens:(

stream_copy_to_stream($client, $dest)

PHP Notice: stream_copy_to_stream(): send of 8192 bytes failed with errno=11 Resource temporarily unavailable in /root/proxy.php on line 59 上記の注意事項ににreffered

ライン59を(これはプロキシスクリプトで発生します) $client

)先のPHPスクリプトを参照するクライアントのSMTPサーバーと$destを参照して私は、これはクライアントが取引先としての宛先にデータを書き込もうとするに関してであると思いinationは忙しいですが、何が忙しいのでしょうか?クライアントがそれに書き込もうとしているときに、デスティネーションはまだプロキシからのストリームからデータを読み込んでいますか?このエラーの原因になりますか?何が起こっているのですか?

上記のプロキシコード以外にコードが必要な場合は、私にお知らせください。この投稿を更新します。

答えて

0

私は厳しいテストの後、解決策を見つけました。コードが設定された方法では、stream_select()機能がブロックされ、と表示されるデータを$clientストリームが利用できるように待っていました。問題は、宛先ストリームが書き込み可能になるまでブロックするために、2番目のstream_select()を含めなかったことです。 stream_copy_to_stream()に3番目のパラメータは、データではなく$clientからあまりにも多くのデータをコピーする、安定したペースで流し何であるとして

--- 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:本質的には

は、次のコードは、100%の作品$destに送信し、エラーを引き起こします。

関連する問題