您好,登錄后才能下訂單哦!
在 PHP 中,當使用 copy()
函數進行文件傳輸時,如果傳輸被中斷,可能需要恢復傳輸并繼續從中斷點開始。為了實現這個功能,你可以使用 cURL 庫來實現斷點續傳。
以下是一個使用 cURL 實現斷點續傳的示例:
<?php
function resume_broken_transfer($source, $destination, $timeout = 30) {
// 獲取已經下載的文件大小
if (file_exists($destination)) {
$downloadedBytes = filesize($destination);
} else {
$downloadedBytes = 0;
}
// 初始化 cURL
$ch = curl_init();
// 設置 cURL 選項
curl_setopt($ch, CURLOPT_URL, $source);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, function ($resource, $downloadSize, $downloaded, $uploadSize, $uploaded) use ($downloadedBytes) {
echo "Downloaded: " . ($downloaded + $downloadedBytes) . " bytes\n";
});
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_RESUME_FROM, $downloadedBytes);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
// 開始傳輸
$result = curl_exec($ch);
// 檢查是否有錯誤
if (curl_errno($ch)) {
echo 'Error: ' . curl_error($ch);
return false;
}
// 關閉 cURL
curl_close($ch);
// 將結果追加到目標文件
file_put_contents($destination, $result, FILE_APPEND);
return true;
}
// 使用示例
$source = 'http://example.com/large-file.zip';
$destination = 'local-large-file.zip';
$resumed = resume_broken_transfer($source, $destination);
if ($resumed) {
echo "File transfer completed successfully.\n";
} else {
echo "File transfer failed.\n";
}
?>
這個示例中的 resume_broken_transfer()
函數接受三個參數:源文件 URL、目標文件路徑和超時時間(默認為 30 秒)。函數首先檢查目標文件是否存在,如果存在,則獲取已下載的字節數。然后,使用 cURL 庫下載文件,并在下載過程中使用回調函數顯示下載進度。如果傳輸被中斷,函數將恢復傳輸并從中斷點繼續。最后,將下載的數據追加到目標文件。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。