سؤال

أنا باستخدام بسيطة بفك وظيفة (كما هو موضح أدناه) للحصول على الملفات الخاصة بي لذلك أنا لا عليك فك ضغط الملفات يدويا قبل أن يتم معالجة إضافية.

function uncompress($srcName, $dstName) {
    $string = implode("", gzfile($srcName));
    $fp = fopen($dstName, "w");
    fwrite($fp, $string, strlen($string));
    fclose($fp);
} 

المشكلة هي أنه إذا كان gzip الملف كبير (مثلا ، 50mb) في حيويي يأخذ كمية كبيرة من ذاكرة الوصول العشوائي إلى عملية.

السؤال:يمكنني تحليل الملفات المضغوطة في قطع ولا يزال الحصول على النتيجة الصحيحة?أو هل هناك أفضل طريقة أخرى للتعامل مع مسألة استخراج كبيرة gzip الملفات (حتى لو استغرق ذلك بضع ثوان أكثر)?

هل كانت مفيدة؟

المحلول

وgzfile () هو وسيلة الراحة التي تدعو gzopen، gzread، وgzclose.

وهكذا، نعم، يمكنك القيام به يدويا gzopen وgzread الملف في قطع.

وهذا سوف إلغاء ضغط الملف في قطع 4KB:

function uncompress($srcName, $dstName) {
    $sfp = gzopen($srcName, "rb");
    $fp = fopen($dstName, "w");

    while (!gzeof($sfp)) {
        $string = gzread($sfp, 4096);
        fwrite($fp, $string, strlen($string));
    }
    gzclose($sfp);
    fclose($fp);
}

نصائح أخرى

وتحاول مع

function uncompress($srcName, $dstName) {
    $fp = fopen($dstName, "w");
    fwrite($fp, implode("", gzfile($srcName)));
    fclose($fp);
}

و$ طول المعلمة اختيارية.

إذا كنت على نظام لينكس استضافة المطلوبة privilegies لتشغيل الأوامر ، gzip الأمر تثبيت هل بامكاني ذلك مع شيء من هذا القبيل shell_exec

شيئا قليلا من هذا القبيل ، أعتقد أنه سيفعل :

shell_exec('gzip -d your_file.gz');

هذه الطريقة ، فإن الملف لن يتم فك الضغط بواسطة PHP.


كما sidenote :

  • العناية حيث تشغيل الأمر من (ot استخدام سويث أن أقول "ضغط على أن الدليل")
  • قد ترغب في إلقاء نظرة على escapeshellarg جدا ;-)

maliayas المذكورة، فإنه قد يؤدي إلى خطأ برمجي. أنا شهدت انخفاض غير متوقع للخروج من حلقة في حين، ولكن تم فك ضغط ملف GZ بنجاح. رمز كله يبدو وكأنه هذا ويعمل بشكل أفضل بالنسبة لي:

function gzDecompressFile($srcName, $dstName) { 
    $error = false; 

    if( $file = gzopen($srcName, 'rb') ) { // open gz file

        $out_file = fopen($dstName, 'wb'); // open destination file

        while (($string = gzread($file, 4096)) != '') { // read 4kb at a time   
            if( !fwrite($out_file, $string) ) { // check if writing was successful
                 $error = true;
            }   
        }

        // close files
        fclose($out_file);
        gzclose($file);     

    } else {
        $error = true;
    }

    if ($error)
        return false; 
    else
        return true; 
} 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top