簡體   English   中英

如何檢測stream_copy_to_stream錯誤?

[英]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不會收到錯誤。 我知道可以用復制的字節數來檢查文件的總長度,但這只有在可以提前確定流的總長度時才有效。

由於這是隨機發生的,我認為連接只是因為一些奇怪的原因而被丟棄(但如果有人有任何建議來減少這種情況發生的可能性,我會全力以赴)。 但能夠知道轉移是否完全成功是很好的。 反正有沒有檢測到問題:

  • 必須提前知道流的長度
  • 掛鈎到PHP錯誤處理程序以獲取錯誤

...或者可能使用緩沖的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM