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 个笔记

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

<?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);
}

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

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

将无限循环。
robinv12001 at yahoo dot co dot in
15 年前
<?php
// 使用 FTP 下载当前日期的压缩文件从远程服务器
// 压缩文件被解压缩
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);
?>
utku
16 年前
我认为将整个 gzip 文件(它本来就是为了压缩而存在的,并且很可能是一个非常大的文件)打开到一个字符串中并不明智。你很可能会遇到 PHP 内存限制。相反,如果你需要处理文件,将你的 gzread 调用放在循环中,并通过一个设置为常值的 $length 来增量读取。
imp
1 年前
最大 $length 为 2147483647 字节 (2^32-1)。

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

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

希望我解释清楚了 :)
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);
}
?>
zaotong at yahoo dot com
17 年前
正如另一个论坛向我展示的那样,有一种方法可以通过查看 gzip 文件的最后 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);
?>

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

感谢 stereofrog 为我提供此代码。
calin_ip at yahoo dot com
13 年前
关于找出 gzip 文件的长度。
出于某种原因,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