fwrite(): send of xx bytes failed with errno=32 Broken pipe のエラーはkeepaliveが切れちゃうせいだった

XML RPC でサーバとやり取りしている PHP のバッチで、fwrite(): send of xx bytes failed with errno=32 Broken pipe のエラーが起きて原因がわからず困ってたことがあった。

そのバッチでは XML RPC のクライアントを最初に作って、それをずっと使いまわしていた。

その場合サーバとの接続はkeepaliveで維持される。

されるんだけど、あるリクエストを投げてから次のリクエストを投げるまでにとても時間がかかっているところがあった。(数分とか?)

エラーはそこで起きていた。

tcpdumpを眺めていると最後に通信してから90秒くらいたったところでRSTが来て通信が切れてた。(そのくらいでkeepaliveのtimeoutを迎えて切断されていた様子)

後続の処理は何も知らずにそこに書き込もうとしているのでこのエラーが起きる。

そんなに大量に接続するわけじゃないのでクライアントを作り直せばええやん、と思っていたのだけどこのときは真面目で優秀な若者が数分かかっていた処理を数秒に高速化して問題を解決した。

同じ原因でこのエラーにあったら、無駄な処理で時間がかかっているなら速くして接続が切れる前に通信を続けられればいいし、重い処理でどうしても時間がかかるならクライアントを分けるか、切れてたら接続し直すなどすれば解決できるはず。