第三个参数 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)