Uploaded image for project: 'Moodle'
  1. Moodle
  2. MDL-17614

unzip_file function in moodlelib

    XMLWordPrintable

    Details

    • Type: Improvement
    • Status: Closed
    • Priority: 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.

        Attachments

          Issue Links

            Activity

              People

              Assignee:
              danmarsden Dan Marsden
              Reporter:
              woolardfa@appstate.edu Fred Woolard
              Tester:
              Nobody
              Participants:
              Component watchers:
              Adrian Greeve, Jake Dallimore, Mathew May, Mihail Geshoski, Peter Dias
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

                Dates

                Created:
                Updated:
                Resolved: