سؤال

أنا أكتب البرنامج النصي PHP الذي يولد ملفات Gzzeced. النهج الذي استخدمته هو بناء سلسلة في PHP و GZCompress () السلسلة قبل كتابةها إلى ملف في نهاية البرنامج النصي.

الآن أختبر البرنامج النصي الخاص بي مع ملفات أكبر ويدير إلى أخطاء تخصيص الذاكرة. يبدو أن سلسلة النتائج أصبحت كبيرة جدا لعقد في الذاكرة في وقت واحد.

لحل هذا لقد حاولت استخدام gzopen () و gzwrite () لتجنب تخصيص سلسلة كبيرة في PHP. ومع ذلك، فإن الملف Gzpeced الذي تم إنشاؤه مع GZWrite () يختلف كثيرا عن عندما أستخدم GZCompress (). لقد جربت مستويات ZIP مختلفة ولكنها لا تساعد. لقد حاولت أيضا استخدام gzdeflate () وينتهي بها إلى نفس النتائج مثل gzwrite ()، ولكن لا تزال غير مشابهة ل GZCompress (). ليس فقط أول بايتين (رأس ZLIB) مختلفان، إنه الملف بأكمله.

ماذا gzcompress () تفعل بشكل مختلف عن هذه الوظائف GZIP الأخرى في PHP؟ هل هناك طريقة يمكنني محاكاة نتائج gzcompress () أثناء إنتاج النتيجة تدريجيا؟

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

المحلول

أنا لست متأكدا 100٪، لكن تخميني هو أن GZCompress يستخدم تنسيق gzip، و gzopen / gzwrite استخدم zlib. بصراحة، لا أستطيع أن أخبرك ما الفرق بين الاثنين، لكنني أعرف أن Gzip يستخدم ZLIB للضغط الفعلي.

من المحتمل أن أيا من ذلك سوف يهم رغم ذلك. حاول إنشاء ملف Gzip باستخدام Gzopen / GzWrite ثم ضغطه باستخدام برنامج Gzip لسطر الأوامر. إذا كان يعمل، فسوف يعمل استخدام Gzopen / Gzwrite من أجلك.

نصائح أخرى

الفرق الأساسي هو أن وظيفة GZWRITE تبدأ ZLIB بخيار Sync_flush، والتي ستقوم بتسويق الإخراج إلى حدود 4 بايت (أو هو 2)، ثم قليلا إضافي (0x00 0x00 0xf 0xff 0x03).

إذا كنت تستخدم هذه لإنشاء ملفات مضغوطة، احذر أن تقبل أداة أرشيف Mac الافتراضية هذا التنسيق.

من ما يمكنني أن أقول إليه، فإن Sync_flush هو خيار Gzip، ولا يسمح به في تنسيق PKZIP / INFO-IMP، كل ملفات .zip ومشتقاتها تأتي من.

إذا قمت بتحريك ملف / نص صغير، مما يؤدي إلى كتلة تحريف واحدة، ومقارنتها بنفس النص المكتوبة باستخدام GZWrite، سترى 2 اختلافات، واحدة من البايتات الموجودة في رأس كتلة الانفديل مختلفة بمقدار 1، والنهاية مبطن مع البايت أعلاه. إذا كانت النتيجة أكبر من كتلة تحريف واحدة، فإن الاختلافات تبدأ تتراكم. من الصعب إصلاح هذا، حيث أن رؤوس كتلة تيار الانفصال ليست حتى بايت محاذاة. هناك سبب يستخدم الجميع ZLIB. قليل من الناس شجاعون بما يكفي حتى يحاول إعادة كتابة هذا التنسيق!

ركضت مشكلة مماثلة مرة واحدة - في الأساس لم يكن هناك ما يكفي من ذاكرة الوصول العشوائي المخصصة ل PHP للقيام بالأعمال التجارية.

انتهى الأمر بحفظ السلسلة كملف نصي، ثم استخدام Exec () إلى Gzip الملف باستخدام نظام الملفات. ليس حل مثالي ولكنه يعمل في وضعي.

حاول زيادة المعلمة memory_limit في ملف php.ini

استخدم كل من GZCompress () و GzOpen () طريقة الانفصال لضغط الكتل. لكن لديهم رأس / مقطورة مختلفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top