سؤال
أنا باستخدام بسيطة بفك وظيفة (كما هو موضح أدناه) للحصول على الملفات الخاصة بي لذلك أنا لا عليك فك ضغط الملفات يدويا قبل أن يتم معالجة إضافية.
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;
}