Moodle

unzip_file function in moodlelib

Details

  • Type: Improvement Improvement
  • Status: Closed Closed
  • Priority: Minor Minor
  • Resolution: Duplicate
  • Affects Version/s: 1.9.2
  • Fix Version/s: None
  • Component/s: Backup
  • Labels:
    None
  • Affected Branches:
    MOODLE_19_STABLE

Description

I'm fairly new to PHP programming, so I'm just tossing this out there to see what the more exprerienced folks think: During a restore of a sizable course backup file, the process kept failing due to a memory limit error. I adjusted the memory limit in php.ini to 256M (which I think is a bit much), and it still pukes.

Looking at the code, I notice the use of gzinflate (Zlib) in the pclzip.lib.php. Is that the best library to use? It seems the gz* functions are oriented towards compression/decompression of content sent to and from the user-agent, and not so much for files. The line (3806) where the memory limit error occurs look like: $v_file_content = @gzinflate($v_buffer);

It happens that the file content being inflated (moodle.xml) is 198MB.

I was thinking the regular Zip libraries might work a little better. So in moodlelib.php, unzip_file function, at about line 7343, I made this change:

/*
include_once("$CFG->libdir/pclzip/pclzip.lib.php");
$archive = new PclZip(cleardoubleslashes("$zippath/$zipfilename"));
if (!$list = $archive->extract(PCLZIP_OPT_PATH, $destpath,
PCLZIP_CB_PRE_EXTRACT, 'unzip_cleanfilename',
PCLZIP_OPT_EXTRACT_DIR_RESTRICTION, $destpath)) {
if (!empty($showstatus)) { notice($archive->errorInfo(true)); }
return false;
}
*/
$archive = new ZipArchive();
if (true === ($res = $archive->open(cleardoubleslashes("$zippath/$zipfilename")))) { $archive->extractTo($destpath); $archive->close(); }
elseif (!empty($showstatus)) { notice('Unzip of file failed, code:' . $res); }

No more memory limit error. I've even lowered the memory_limit setting in php.ini to 64M.

Regards.

Issue Links

Activity

Hide
Dan Marsden added a comment -

please see MDL-15928

this is planned for Moodle 2.0 - it's not possible for Moodle 1.9 and lower as it supports earlier versions of PHP

workaround for 1.9 and earlier is to use an external zip binary - see admin > Server > System paths.

Show
Dan Marsden added a comment - please see MDL-15928 this is planned for Moodle 2.0 - it's not possible for Moodle 1.9 and lower as it supports earlier versions of PHP workaround for 1.9 and earlier is to use an external zip binary - see admin > Server > System paths.
Hide
Charles Fulton added a comment -

However, lots of people running Moodle 1.9+ are running PHP 5 or higher; including this as an option if ZipArchive is available in the environment might be nice. I've got some half-written code that does this for zipping files.

Show
Charles Fulton added a comment - However, lots of people running Moodle 1.9+ are running PHP 5 or higher; including this as an option if ZipArchive is available in the environment might be nice. I've got some half-written code that does this for zipping files.
Hide
Charles Fulton added a comment -

Should anyone be curious, here's a patch on my github repo with Fred's unzipping code and my zipping code: https://github.com/mackensen/moodle/compare/MOODLE_19_STABLE...mdl-17614. This will only work if you have ZipArchive available on your webserver.

Show
Charles Fulton added a comment - Should anyone be curious, here's a patch on my github repo with Fred's unzipping code and my zipping code: https://github.com/mackensen/moodle/compare/MOODLE_19_STABLE...mdl-17614. This will only work if you have ZipArchive available on your webserver.

People

Vote (0)
Watch (1)

Dates

  • Created:
    Updated:
    Resolved: