您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    如何在不会招致效劳器宕机的状况下,用PHP读取大文件(3)
    时间:2017-12-05 21:10 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    第三个参数 stream_copy_to_stream 和第二个参数是同一类参数(默许值相反), stream_copy_to_stream 一次从一个数据流里读一行,同时写到另一个数据流里。 它跳过生成器只要一个值的部分(由于我们不需求这个值)。

    这篇文章关于我们来说能够是没用的,所以让我们想一些我们能够会用到的例子。假定我们想从我们的CDN中输入一张图片,作为一种重定向的路由运用顺序。我们可以参照下边的代码来完成它:

    // from piping-files-3.php 

     

    file_put_contents( 

        "piping-files-3.jpeg", file_get_contents( 

            "https://github.com/assertchris/uploads/raw/master/rick.jpg" 

        ) 

    ); 

     

    // ...or write this straight to stdout, if we don't need the memory info 

     

    require "memory.php"

    想象一下,一个路由运用顺序让我们看到这段代码。但是,我们想从CDN获取一个文件,而不是从本地的文件系统获取。我们可以用一些其他的东西来更好的交流 file_get_contents (就像 Guzzle ),即使在引擎外部它们简直是一样的。

    图片的内存大约有581K。如今,让我们来试试这个

    // from piping-files-4.php 

     

    $handle1 = fopen( 

        "https://github.com/assertchris/uploads/raw/master/rick.jpg""r" 

    ); 

     

    $handle2 = fopen( 

        "piping-files-4.jpeg""w" 

    ); 

     

    // ...or write this straight to stdout, if we don't need the memory info 

     

    stream_copy_to_stream($handle1, $handle2); 

     

    fclose($handle1); 

    fclose($handle2); 

     

    require "memory.php"

    内存运用清楚变少(大约 400K ),但是结果是一样的。假设我们不关注内存信息,我们照旧可以用标准形式输入。实践上,PHP提供了一个复杂的方式来完成:

    $handle1 = fopen( 

        "https://github.com/assertchris/uploads/raw/master/rick.jpg""r" 

    ); 

     

    $handle2 = fopen( 

        "php://stdout""w" 

    ); 

     

    stream_copy_to_stream($handle1, $handle2); 

     

    fclose($handle1); 

    fclose($handle2); 

     

    // require "memory.php"

    还有其它一些流,我们可以经过管道来写入和读取(或只读取/只写入):

    php://stdin (只读)

    php://stderr (只写, 如php://stdout)

    php://input (只读) 这使我们可以拜访原始央求体

    php://output (只写) 让我们写入输入缓冲区

    php://memory 和 php://temp (读-写) 是我们可以暂时存储数据的中央。 不同之处在于一旦它变得足够大 php://temp 会将数据存储在文件系统中,而 php://memory 将不断持存储在内存中直到资源耗尽。

    还有一个我们可以在stream上运用的技巧,称为 过滤器 。它们是一种中间的步骤,提供对stream数据的一些控制,但不把他们暴露给我们。想象一下,我们 会运用Zip扩展名 来紧缩我们的shakespeare.txt文件。

    // from filters-1.php 

     

    $zip = new ZipArchive(); 

    $filename = "filters-1.zip"

     

    $zip->open($filename, ZipArchive::CREATE); 

    $zip->addFromString("shakespeare.txt", file_get_contents("shakespeare.txt")); 

    $zip->close(); 

     

    require "memory.php"

    这是一小段整洁的代码,但它测量内存占用在10.75MB左右。运用过滤器的话,我们可以增加内存:

    // from filters-2.php 

     

    $handle1 = fopen( 

        "php://filter/zlib.deflate/resource=shakespeare.txt""r" 

    ); 

     

    $handle2 = fopen( 

        "filters-2.deflated""w" 

    ); 

     

    stream_copy_to_stream($handle1, $handle2); 

     

    fclose($handle1); 

    fclose($handle2); 

     

    require "memory.php"

    此处,我们可以看到名为php://filter/zlib.deflate的过滤器,它读取并紧缩资源的内容。我们可以在之后将紧缩数据导出到另一个文件中。这仅运用了 896KB .

    我知道这是不一样的格式,或许制造zip存档是有益处的。你不得不疑心:假设你可以选择不同的格式并节省约12倍的内存,为什么不选呢?

    为了解压此数据,我们可以经过执行另一个zlib filter将紧缩后的数据恢复:

    // from filters-2.php 

     

    file_get_contents( 

        "php://filter/zlib.inflate/resource=filters-2.deflated" 

    ); 

    Streams have been extensively covered in Stream在“ 了解PHP中的流 ”和“ U高效运用PHP中的流 ”中曾经被片面引见了。假设你喜欢一个完全不同的视角,可以阅读一下。

    【编辑引荐】

    曙光PHPC200团体HPC云端系统运用初探

    案例解析:曙光PHPC200在气候行业中的运用

    window + nginx-rtmp + php-cgi 效劳器搭建

    PHP-MSF:基于Swoole的工程级企业微效劳框架

    PHP跳转后Session丧失值的处置办法

    (责任编辑:admin)