0

我有一种解决方案的“开始”。我写了这个函数(对不起间距):

<?php
set_time_limit(0);

// Just to get the remote filesize

function checkFilesize($url, $user = "", $pw = ""){

 ob_start();

 $ch = curl_init($url);

 curl_setopt($ch, CURLOPT_HEADER, 1);

 curl_setopt($ch, CURLOPT_NOBODY, 1);

 if(!empty($user) && !empty($pw)){

  $headers = array('Authorization: Basic ' .  base64_encode("$user:$pw"));

  curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

 }

 $ok = curl_exec($ch);

 curl_close($ch);

 $head = ob_get_contents();

 ob_end_clean();

 $regex = '/Content-Length:\s([0-9].+?)\s/';

 $count = preg_match($regex, $head, $matches);

 return isset($matches[1]) ? $matches[1] : "unknown";

}

// Split filesize to threads

function fileCutter($filesize,$threads){

 $calc = round($filesize / count($threads));

 $count = 0;

 foreach($threads as $thread){

  $rounds[$count] =  $calc;

  $count++;

 }

 $count = 0;

 foreach($rounds as $round){

  $set = $count + 1;

  if($count == 0){

   $from = 0;

  } else {

   $from = ($round * $count);

  }

  $cal = ($round * $set);

  $final[$count] = array('from'=>$from,'to'=>$cal);

  $count++;

 }

 // Correct the "Rounded" result

 $end = end($final);

 $differance = $filesize - $end['to'];

 if (strpos($differance,'-') !== false) {} else {$add = '+';}

 $end_result =  ($end['to'].$add.$differance);

 $value=eval("return ($end_result);");

 $end_id = end(array_keys($final));

 $final[$end_id]['to'] = $value;

 // Return the complete array with the corrected result

 return $final;

}

$threads = array(
 0=>'test',
 1=>'test',
 2=>'test',
 3=>'test',
 4=>'test',
 5=>'test',
);

$file  = 'http://www.example.com/file.zip';

$filesize = checkFilesize($file);

$cuts = fileCutter($filesize,$threads);

print_r($cuts);

?>

(再次,对不起。:))

它给出了将文件拆分为特定字节的“方向”。我试图做这样的事情:

foreach($cuts as $cut){
$start = $cut['from'];
$finish = $cut['to'];
$f = fopen($file, "rb");
fseek($f, $start, SEEK_SET);
while(!(ftell($f) > $finish)){
  $data = fgetc($f);
}
fclose($f);

但它会陷入无限循环。问题是什么?或者,PHP 中是否有另一种解决方案来拆分和合并文件?

4

1 回答 1

3

而不是手动和逐字节读取文件,您可以使用file_get_contents()相应的参数$offset$maxlen

//                             $incp  $ctx  $offset  $maxlen
$data = file_get_contents($fn, FALSE, NULL, $start, $finish-$start);

这将为您完成寻找和切割。

于 2012-09-29T14:30:15.380 回答