首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > PHP >

有没有思忖过用PHP来做多线程操作

2012-10-19 
有没有考虑过用PHP来做多线程操作~最近完善下载类中一个远程下载文件 考虑是不是可以分别分段读取文件内容

有没有考虑过用PHP来做多线程操作~
最近完善下载类中一个远程下载文件 考虑是不是可以分别分段读取文件内容 最后组合。经测试可行哦~ 这是我测试的本地文件~
我想的是咋个可以最简单封装针对任意本地文件 or远程文件 进行操作! 请看:
<?php
//PHP分段读取文件 这里我只分了两段 实际上可以通过文件大小 按照预定段大小 进行分段..
$file = dirname(__FILE__).'/bullyframework_zend.7z';

echo filesize($file);

$handle = fopen($file, "rb");

$contents = fread($handle, ceil(filesize($file)/2));//分两次读取文件组合

$now_tell = ftell($handle);//获取当前指针

$end = fread($handle, filesize($file) - $now_tell);//从当前指针处读取剩余文件

fclose($handle);

file_put_contents('test.7z', $contents.$end);//写入文件 验证文件是否完整

echo "<br>";

echo filesize('test.7z');
?>

[解决办法]
分块下载需要双方都支持“断点续传”

一般下载工具都支持,所以你需要做的是服务器端。php实现的断点续传服务大致如下

PHP code
    //   Begin writing headers     header("Cache-Control:");     header("Cache-Control: public");     header("Content-Type: $ctype");     $filespaces = str_replace("_", " ", $filename);     // if your filename contains underscores, replace them with spaces     $header='Content-Disposition: attachment; filename='.$filespaces;     header($header);     header("Accept-Ranges: bytes");          $size = filesize($file);        //   check if http_range is sent by browser (or download manager)        if(isset($_SERVER['HTTP_RANGE'])) {         // if yes, download missing part               $seek_range = substr($_SERVER['HTTP_RANGE'] , 6);         $range = explode( '-', $seek_range);          if($range[0] > 0) { $seek_start = intval($range[0]); }          if($range[1] > 0) { $seek_end  =  intval($range[1]); }                      header("HTTP/1.1 206 Partial Content");         header("Content-Length: " . ($seek_end - $seek_start + 1));         header("Content-Range: bytes $seek_start-$seek_end/$size");      } else {         header("Content-Range: bytes 0-$seek_end/$size");         header("Content-Length: $size");      }        //open the file     $fp = fopen("$file","rb");          //seek to start of missing part        fseek($fp,$seek_start);         //start buffered download     $n = 0;    while(!feof($fp)) {                //reset time limit for big files         echo fread($fp,1024*$speed);      }     fclose($fp);      exit; 

热点排行