Hướng dẫn dùng gz file trong PHP

Bản thân PHP có một số chức năng để xử lý các tệp gzip.

Nếu bạn muốn tạo một tệp mới, không nén, nó sẽ giống như thế này.

Lưu ý: Điều này không kiểm tra xem tệp đích có tồn tại trước hay không, không xóa tệp đầu vào hoặc thực hiện bất kỳ kiểm tra lỗi nào. Bạn thực sự nên sửa chúng trước khi sử dụng điều này trong mã sản xuất.

// This input should be from somewhere else, hard-coded in this example
$file_name = 'file.txt.gz';

// Raising this value may increase performance
$buffer_size = 4096; // read 4kb at a time
$out_file_name = str_replace['.gz', '', $file_name];

// Open our files [in binary mode]
$file = gzopen[$file_name, 'rb'];
$out_file = fopen[$out_file_name, 'wb'];

// Keep repeating until the end of the input file
while[!gzeof[$file]] {
    // Read buffer-size bytes
    // Both fwrite and gzread and binary-safe
    fwrite[$out_file, gzread[$file, $buffer_size]];
}

// Files are done, close files
fclose[$out_file];
gzclose[$file];

Lưu ý: Đây giao dịch với gzip chỉ . Nó không đối phó với hắc ín.

48 hữu ích 2 bình luận chia sẻ

Bản thân PHP có một số chức năng để xử lý các tệp gzip.

Nếu bạn muốn tạo một tệp mới, không nén, nó sẽ giống như thế này.

Lưu ý: Điều này không kiểm tra xem tệp đích có tồn tại trước hay không, không xóa tệp đầu vào hoặc thực hiện bất kỳ kiểm tra lỗi nào. Bạn thực sự nên sửa chúng trước khi sử dụng điều này trong mã sản xuất.

// This input should be from somewhere else, hard-coded in this example
$file_name = 'file.txt.gz';

// Raising this value may increase performance
$buffer_size = 4096; // read 4kb at a time
$out_file_name = str_replace['.gz', '', $file_name];

// Open our files [in binary mode]
$file = gzopen[$file_name, 'rb'];
$out_file = fopen[$out_file_name, 'wb'];

// Keep repeating until the end of the input file
while[!gzeof[$file]] {
    // Read buffer-size bytes
    // Both fwrite and gzread and binary-safe
    fwrite[$out_file, gzread[$file, $buffer_size]];
}

// Files are done, close files
fclose[$out_file];
gzclose[$file];

Lưu ý: Đây giao dịch với gzip chỉ . Nó không đối phó với hắc ín.

48 hữu ích 2 bình luận chia sẻ

Tôi muốn gzip nén một tệp trên máy chủ của mình bằng PHP. Có ai có một ví dụ sẽ nhập một tệp và xuất một tệp nén không?

  • php
  • compression
  • gzip

57 hữu ích 0 bình luận 55k xem chia sẻ

answer

95

Các câu trả lời khác ở đây tải toàn bộ tệp vào bộ nhớ trong quá trình nén, điều này sẽ gây ra lỗi ' hết bộ nhớ ' trên các tệp lớn. Hàm bên dưới sẽ đáng tin cậy hơn trên các tệp lớn vì nó đọc và ghi các tệp ở các khối 512kb.

/**
 * GZIPs a file on disk [appending .gz to the name]
 *
 * From //stackoverflow.com/questions/6073397/how-do-you-create-a-gz-file-using-php
 * Based on function by Kioob at:
 * //www.php.net/manual/en/function.gzwrite.php#34955
 * 
 * @param string $source Path to file that should be compressed
 * @param integer $level GZIP compression level [default: 9]
 * @return string New filename [with .gz appended] if success, or false if operation fails
 */
function gzCompressFile[$source, $level = 9]{ 
    $dest = $source . '.gz'; 
    $mode = 'wb' . $level; 
    $error = false; 
    if [$fp_out = gzopen[$dest, $mode]] { 
        if [$fp_in = fopen[$source,'rb']] { 
            while [!feof[$fp_in]] 
                gzwrite[$fp_out, fread[$fp_in, 1024 * 512]]; 
            fclose[$fp_in]; 
        } else {
            $error = true; 
        }
        gzclose[$fp_out]; 
    } else {
        $error = true; 
    }
    if [$error]
        return false; 
    else
        return $dest; 
} 

95 hữu ích 2 bình luận chia sẻ

answer

100

Mã này thực hiện thủ thuật

// Name of the file we're compressing
$file = "test.txt";

// Name of the gz file we're creating
$gzfile = "test.gz";

// Open the gz file [w9 is the highest compression]
$fp = gzopen [$gzfile, 'w9'];

// Compress the file
gzwrite [$fp, file_get_contents[$file]];

// Close the gz file and we're done
gzclose[$fp];

100 hữu ích 3 bình luận chia sẻ

answer

22

Ngoài ra, bạn có thể sử dụng các trình bao bọc của php , những trình nén . Với một thay đổi nhỏ trong mã, bạn sẽ có thể chuyển đổi giữa gzip, bzip2 hoặc zip.

$input = "test.txt";
$output = $input.".gz";

file_put_contents["compress.zlib://$output", file_get_contents[$input]];

chuyển compress.zlib://sang compress.zip://nén zip [xem nhận xét cho câu trả lời này về nén zip] hoặc sang compress.bzip2://nén bzip2.

22 hữu ích 2 bình luận chia sẻ

answer

6

Đơn giản một lớp lót với gzencode [] :

gzencode[file_get_contents[$file_name]];

6 hữu ích 1 bình luận chia sẻ

answer

3

Nếu bạn đang muốn giải nén một tệp, điều này hoạt động và không gây ra sự cố với bộ nhớ:

$bytes = file_put_contents[$destination, gzopen[$gzip_path, r]];

3 hữu ích 0 bình luận chia sẻ

answer

3

Đó là lẽ hiển nhiên đối với nhiều người, nhưng nếu một trong các chức năng thực hiện chương trình được kích hoạt trên hệ thống của bạn [ exec, system, shell_exec], bạn có thể sử dụng chúng để đơn giản gzipcác tập tin.

exec["gzip ".$filename];

NB: Hãy chắc chắn rằng $filenamebiến đúng cách trước khi sử dụng, đặc biệt nếu nó đến từ đầu vào của người dùng [nhưng không chỉ]. Nó có thể được sử dụng để chạy các lệnh tùy ý, ví dụ như bằng cách chứa một cái gì đó như my-file.txt && anothercommand[hoặc my-file.txt; anothercommand].

3 hữu ích 3 bình luận chia sẻ

answer

0

copy ['file.txt', 'archi.zlib: //'. 'file.txt.gz']; Xem tài liệu

0 hữu ích 0 bình luận chia sẻ

answer

0

Đây là một phiên bản cải tiến. Tôi đã loại bỏ tất cả các câu lệnh if / else lồng nhau, dẫn đến độ phức tạp theo chu kỳ thấp hơn, xử lý lỗi tốt hơn thông qua các ngoại lệ thay vì theo dõi trạng thái lỗi boolean, một số kiểu gợi ý và tôi sẽ bỏ qua nếu tệp có phần mở rộng gz đã sẵn sàng. Nó dài hơn một chút về các dòng mã, nhưng nó dễ đọc hơn nhiều.

/**
 * Compress a file using gzip
 *
 * Rewritten from Simon East's version here:
 * //stackoverflow.com/a/22754032/3499843
 *
 * @param string $inFilename Input filename
 * @param int    $level      Compression level [default: 9]
 *
 * @throws Exception if the input or output file can not be opened
 *
 * @return string Output filename
 */
function gzcompressfile[string $inFilename, int $level = 9]: string
{
    // Is the file gzipped already?
    $extension = pathinfo[$inFilename, PATHINFO_EXTENSION];
    if [$extension == "gz"] {
        return $inFilename;
    }

    // Open input file
    $inFile = fopen[$inFilename, "rb"];
    if [$inFile === false] {
        throw new \Exception["Unable to open input file: $inFilename"];
    }

    // Open output file
    $gzFilename = $inFilename.".gz";
    $mode = "wb".$level;
    $gzFile = gzopen[$gzFilename, $mode];
    if [$gzFile === false] {
        fclose[$inFile];
        throw new \Exception["Unable to open output file: $gzFilename"];
    }

    // Stream copy
    $length = 512 * 1024; // 512 kB
    while [!feof[$inFile]] {
        gzwrite[$gzFile, fread[$inFile, $length]];
    }

    // Close files
    fclose[$inFile];
    gzclose[$gzFile];

    // Return the new filename
    return $gzFilename;
}

0 hữu ích 0 bình luận chia sẻ

answer

0

Nén thư mục cho bất kỳ ai cần

function gzCompressFile[$source, $level = 9]
{
    $tarFile = $source . '.tar';

    if [is_dir[$source]] {
        $tar = new PharData[$tarFile];
        $files = scandir[$source];
        foreach [$files as $file] {
            if [is_file[$source . '/' . $file]] {
                $tar->addFile[$source . '/' . $file, $file];
            }
        }
    }

    $dest = $tarFile . '.gz';
    $mode = 'wb' . $level;
    $error = false;
    if [$fp_out = gzopen[$dest, $mode]] {
        if [$fp_in = fopen[$tarFile, 'rb']] {
            while [!feof[$fp_in]]
                gzwrite[$fp_out, fread[$fp_in, 1024 * 512]];
            fclose[$fp_in];
        } else {
            $error = true;
        }
        gzclose[$fp_out];
        unlink[$tarFile];
    } else {
        $error = true;
    }
    if [$error]
        return false;
    else
        return $dest;
}

0 hữu ích 0 bình luận chia sẻ

Đăng nhập để trả lời câu hỏi

Có thể bạn quan tâm

Chủ Đề