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 に答える