[英]How to detect stream_copy_to_stream errors?
我有一些代碼,簡化,看起來像:
$fout = fsockopen($host, 80); stream_set_timeout($fout, 10*3600); // 10 hours $fin = fopen($file, 'rb'); // not really a file stream, but good enough proxy here $readbytes = stream_copy_to_stream($fin, $fout); if(!$readbytes) die('copy failed');
但是,我有時會遇到以下類型的錯誤:
Notice: stream_copy_to_stream(): send of 952 bytes failed with errno=104 Connection reset by peer in ... Notice: stream_copy_to_stream(): send of 952 bytes failed with errno=32 Broken pipe in ...
並檢查$ readbytes不會收到錯誤。 我知道可以用復制的字節數來檢查文件的總長度,但這只有在可以提前確定流的總長度時才有效。
由於這是隨機發生的,我認為連接只是因為一些奇怪的原因而被丟棄(但如果有人有任何建議來減少這種情況發生的可能性,我會全力以赴)。 但能夠知道轉移是否完全成功是很好的。 反正有沒有檢測到問題:
...或者可能使用緩沖的fread / fwrite循環,檢查寫入的字節長度,這里是最佳解決方案?
謝謝。
好的,所以這是我的流復制功能,它試圖檢測錯誤,但它似乎仍然失敗(我認為fwrite意味着返回正確的字節數)
function stream_copy($in, $out, $limit=null, $offset=null) { $bufsize = 32*1024; if(isset($offset)) fseek($in, $offset, SEEK_CUR); while(!feof($in)) { if(isset($limit)) { if(!$limit) break; $data = fread($in, min($limit,$bufsize)); } else $data = fread($in, $bufsize); $datalen = strlen($data); $written = fwrite($out, $data); if($written != $datalen) { return false; // write failed } if(isset($limit)) $limit -= $datalen; } return true; }
在上面的函數中,即使顯示錯誤,我仍然會返回'true'。
所以我只是想嘗試掛鈎PHP的錯誤處理程序。 沒有測試過以下內容,但我的猜測是它應該可以工作
function stream_copy_to_stream_testerr($source, $dest) { $args = func_get_args(); global $__stream_copy_to_stream_fine; $__stream_copy_to_stream_fine = true; set_error_handler('__stream_copy_to_stream_testerr'); call_user_func_array('stream_copy_to_stream', $args); restore_error_handler(); return $__stream_copy_to_stream_fine; } function __stream_copy_to_stream_testerr() { $GLOBALS['__stream_copy_to_stream_fine'] = false; return true; }
丑陋,但我能看到的唯一解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.