Issue Details (XML | Word | Printable)

Key: MDL-17614
Type: Improvement Improvement
Status: Resolved Resolved
Resolution: Duplicate
Priority: Minor Minor
Assignee: Dan Marsden
Reporter: Fred Woolard
Votes: 0
Watchers: 1
Operations

Add/Edit UI Mockup to this issue
If you were logged in you would be able to see more operations.
Moodle

unzip_file function in moodlelib

Created: 12/Dec/08 09:08 AM   Updated: 12/Dec/08 04:02 PM
Return to search
Component/s: Backup
Affects Version/s: 1.9.2
Fix Version/s: None

Issue Links:
Duplicate
 

Participants: Dan Marsden and Fred Woolard
Security Level: None
Resolved date: 12/Dec/08
Affected Branches: MOODLE_19_STABLE


 Description  « Hide
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.

 All   Comments   Change History   Version Control      Sort Order: Ascending order - Click to sort in descending order
Dan Marsden added a comment - 12/Dec/08 03:59 PM
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.