PHP Conference Japan 2024

gzread

(PHP 4, PHP 5, PHP 7, PHP 8)

gzread二进制安全 gz 文件读取

描述

gzread(资源 $stream, 整数 $length): 字符串|false

gzread() 从给定的 gz 文件指针读取最多 length 个字节。读取操作在读取了 length(未压缩)字节或到达文件结尾 (EOF) 时停止,以先发生者为准。

参数

stream

gz 文件指针。它必须有效,并且必须指向由 gzopen() 成功打开的文件。

length

要读取的字节数。

返回值

已读取的数据,或者在失败时返回 false

变更日志

版本 描述
7.4.0 此函数现在在失败时返回 false;以前返回 0

范例

示例 #1 gzread() 例子

<?php
// 将 gz 文件的内容读取到字符串中
$filename = "/usr/local/something.txt.gz";
$zd = gzopen($filename, "r");
$contents = gzread($zd, 10000);
gzclose($zd);
?>

参见

  • gzwrite() - 二进制安全 gz 文件写入
  • gzopen() - 打开 gz 文件
  • gzgets() - 从文件指针获取行
  • gzgetss() - 从 gz 文件指针获取行并去除 HTML 标签
  • gzfile() - 将整个 gz 文件读取到数组中
  • gzpassthru() - 输出 gz 文件指针上所有剩余数据

添加注释

用户贡献的注释 9 条注释

8
Nitrogen
12 年前
这是一个用于返回 gzip 文件未压缩文件大小的函数。文件大小存储在压缩文件的末尾作为一个 32 位整数,这就是此函数的工作原理。此外,此函数在进行工作之前会检查它是否为真正的 gzip 压缩文件;如果不是,则与其他 gz 函数一样,它会像处理普通文件一样对待它,并执行正常的获取文件大小操作。享受!

<?php

function gzfilesize($filename) {
$gzfs = FALSE;
if((
$zp = fopen($filename, 'r'))!==FALSE) {
if(@
fread($zp, 2) == "\x1F\x8B") { // 这是一个 gzip 文件
fseek($zp, -4, SEEK_END);
if(
strlen($datum = @fread($zp, 4))==4)
extract(unpack('Vgzfs', $datum));
}
else
// 不是 gzip 文件,恢复到常规的文件大小函数
$gzfs = filesize($filename);
fclose($zp);
}
return(
$gzfs);
}

?>
4
waldermort at gmail dot com
7 年前
在循环中读取数据时要小心。gzread() 的行为与 bzread() 或 fread() 有些不同,它在读取流结束后的数据时不会返回 false。而是返回一个空字符串。

因此,像这样的循环
$handle = gzopen($file);
while (false !== $chunk = gzread($handle, $bytes)) {
//...
}

将无限循环。
1
robinv12001 at yahoo dot co dot in
15 年前
<?php
// 使用FTP从远程服务器下载当天日期的gzip文件
// 并解压gzip文件
function parse_rawlist( $array )
{
$i=0;
foreach(
$array as $curraw)
{
$struc = array();
$current = preg_split("/[\s]+/",$curraw,9);

$struc['perms'] = $current[0];
$struc['number'] = $current[1];
$struc['owner'] = $current[2];
$struc['group'] = $current[3];
$struc['size'] = $current[4];
$struc['month'] = $current[5];
$struc['day'] = $current[6];
$struc['time'] = $current[7];
$struc['zfile_name'] = $current[8];
$structure[$i] = $struc;
$i++;
}
return
$structure;

}
ini_set('memory_limit', '100M');

// 请在此处填写FTP信息
//------------------------------------------------------------
$ftp_server = "example.com";
$ftp_user_name = "example";
$ftp_user_pass = "test";
//------------------------------------------------------------
//------------------------------------------------------------
$local_path = '/opt/lampp/htdocs/sample/test.gz';// 本地路径
$server_path = 'outgoing/folder/';// 远程服务器路径
//------------------------------------------------------------

$conn_id = ftp_connect($ftp_server,21);
if(
$conn_id)
{
echo
"连接成功";
}

$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
ftp_chdir($conn_id, $server_path);// 更改当前工作目录
$file_list = ftp_rawlist($conn_id,".");
$zip_details = parse_rawlist($file_list);
set_time_limit(1000);
$curr_date = strtotime(date("F d Y"));
for(
$i=0;$i<count($zip_details);$i++)
{
$fname = $zip_details[$i]['zfile_name'];
$mod_date1 = $zip_details[$i]['month']." ".$zip_details[$i]['day']." ".date("Y");
$mod_date = strtotime($mod_date1);// 文件修改日期
if($mod_date == $curr_date)// 如果修改日期等于当前日期
{
$local_file = $fname;
$server_file = $fname;
if (
ftp_get($conn_id, $local_file, $server_file, FTP_BINARY))
{

echo
"<br/>已成功写入 $local_file\n";
}
else
{
echo
"<br/>出现问题\n";
}
if(
file_exists($local_file))
{
$fzip_size = $zip_details[$i]['size'];
$filename = $local_file;
$ext = pathinfo($filename,PATHINFO_EXTENSION);
$file_name = pathinfo($filename,PATHINFO_FILENAME);
$file_name = $file_name.".csv";
$zd = gzopen($filename, "r");
$contents = gzread($zd, $fzip_size);
$file_name = "uploads/".$file_name;
file_put_contents($file_name,addslashes($contents));
if(
file_exists($file_name))
{
chmod($file_name,0755);
unlink($local_file);
}
gzclose($zd);
}
}
}
ftp_close($conn_id);
?>
2
utku
16年前
我认为将整个 gzip 文件(它之所以被压缩是有原因的,并且可能是一个非常大的文件)打开到单个字符串中并不明智。你很可能会遇到 php 内存限制。相反,如果你需要处理该文件,请将你的 gzread 调用放在循环中,并通过将 $length 设置为一个常数值来增量读取。
0
imp
1年前
最大 $length 为 2147483647 字节 (2^32-1)。

否则 gzread() 返回 false。
0
denis at bitrix dot ru
14年前
请注意,此函数的行为在遇到 EOF 时与 fread 不同。

当你读取最后一块(意味着文件的最后几个字节)时,在 gzread 之后就立即是 EOF,但在 fread 的情况下,你需要再次读取才能获得 EOF。

希望我的解释清楚!:)
0
robinv12001 at yahoo dot co dot in
15 年前
<?php
// 使用PHP解压gzip文件内容并创建新的csv文件
// 在当前文件夹下创建名为uploads的文件夹
$local_file = 'test.gz';

// 获取解压后文件的大小
$FileRead = $local_file;
$FileOpen = fopen($FileRead, "rb");
fseek($FileOpen, -4, SEEK_END);
$buf = fread($FileOpen, 4);
$GZFileSize = end(unpack("V", $buf));
fclose($FileOpen);
// 获取zip文件的大小

$fzip_size = $GZFileSize;

$filename = $local_file;
$ext = pathinfo($filename,PATHINFO_EXTENSION);
$file_name = pathinfo($filename,PATHINFO_FILENAME);
$file_name = $file_name.".csv";

$zd = gzopen($filename, "rb");
$contents = gzread($zd, $fzip_size);
gzclose($zd);
$file_name = "uploads/".$file_name;
$fp = fopen($file_name, "wb");
fwrite($fp, $contents); // 将feed内容写入缓存文件
fclose($fp);
if(
file_exists($file_name))
{
chmod($file_name,0755);
unlink($local_file);
}
?>
0
[email protected]
17年前
正如我在另一个论坛上看到的,有一种方法可以通过查看gz文件的最后4个字节来获取其解压后的尺寸。

这是一段可以实现此功能的代码
<?php
$FileRead
= 'SomeText.txt';
$FileOpen = fopen($FileRead, "rb");
fseek($FileOpen, -4, SEEK_END);
$buf = fread($FileOpen, 4);
$GZFileSize = end(unpack("V", $buf));
fclose($FileOpen);
$HandleRead = gzopen($FileRead, "rb");
$ContentRead = gzread($HandleRead, $GZFileSize);
?>

这将读取gz文件的最后4个字节,并将其用作gzread的文件大小。

感谢stereofrog帮助我编写这段代码。
-3
[email protected]
14年前
关于查找gz文件长度。
由于某种原因,seek()函数不起作用,所以我尝试使用字符串函数查找最后4个字节。
这运行良好。以下是代码。
<?php
$stringu
='my_beautiful_file.txt.gz';
$gzip=file_get_contents($stringu);
$rest = substr($gzip, -4);
$GZFileSize = end(unpack("V", $rest));

$FileRead = $stringu;
$HandleRead = gzopen($FileRead, "rb");
$ContentRead = gzread($HandleRead, $GZFileSize);
gzclose($HandleRead);
?>
To Top