Home > Backend Development > PHP Tutorial > 有没有思忖过用PHP来做多线程操作

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

WBOY
Release: 2016-06-13 13:09:48
Original
760 people have browsed it

有没有考虑过用PHP来做多线程操作~
最近完善下载类中一个远程下载文件 考虑是不是可以分别分段读取文件内容 最后组合。经测试可行哦~ 这是我测试的本地文件~
我想的是咋个可以最简单封装针对任意本地文件 or远程文件 进行操作! 请看:
//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 "
";

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; <div class="clear">
                 
              
              
        
            </div>
Copy after login
Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template