ما هي طريقة الضغط التي يجب استخدامها في PHP؟

StackOverflow https://stackoverflow.com/questions/621976

  •  05-07-2019
  •  | 
  •  

سؤال

لدي كمية كبيرة من البيانات لنقلها باستخدام نصين PHP:واحد على جانب العميل باستخدام برنامج PHP النصي لسطر الأوامر والآخر خلف Apache.أنشر البيانات على جانب الخادم واستخدم دفق php://input لحفظها على نهاية خادم الويب.لمنع الوصول إلى أي حدود للذاكرة، يتم فصل البيانات إلى أجزاء بحجم 500 كيلو بايت لكل طلب POST.كل هذا يعمل بشكل جيد.

الآن، لحفظ النطاق الترددي وتسريعه، أريد ضغط البيانات قبل إرسالها وفك ضغطها عند استلامها على الطرف الآخر.لقد وجدت 3 أزواج من الوظائف التي يمكنها القيام بهذه المهمة، لكن لا يمكنني تحديد أي منها سأستخدمه:

ما زوج الوظائف الذي توصي به ولماذا؟

تحديث: لقد قرأت للتو الأسئلة الشائعة حول zlib:

صيغة gzip (gzencode) تم تصميمه للاحتفاظ بمعلومات الدليل حول ملف واحد، مثل الاسم وتاريخ آخر تعديل.تنسيق زليب (gzcompress) من ناحية أخرى، تم تصميمه لتطبيقات الذاكرة الداخلية وتطبيقات قنوات الاتصال، ويحتوي على رأس ومقطورة أكثر إحكاما ويستخدم فحص سلامة أسرع من gzip.

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

المحلول

كل هذه يمكن استخدامها.هناك فروق دقيقة بين الثلاثة:

  • جيزينكود() يستخدم تنسيق ملف GZIP، وهو نفس تنسيق gzip أداة سطر الأوامر.يحتوي تنسيق الملف هذا على رأس يحتوي على بيانات تعريف اختيارية، وبيانات مضغوطة DEFLATE، وتذييل يحتوي على المجموع الاختباري CRC32 والتحقق من الطول.
  • غزكومبريس () يستخدم تنسيق ZLIB.يحتوي على رأس أقصر يستخدم فقط لتحديد تنسيق الضغط، وتفريغ البيانات المضغوطة، وتذييل يحتوي على المجموع الاختباري ADLER32.
  • غزدفلاتي () يستخدم خوارزمية DEFLATE الخام بمفردها، والتي تعد الأساس لكلا التنسيقين الآخرين.

يستخدم الثلاثة نفس الخوارزمية تحت الغطاء. gzencode() يضيف القدرة على تضمين اسم الملف الأصلي والبيانات البيئية الأخرى (لا يتم استخدام هذا عند ضغط سلسلة فقط). gzencode() و gzcompress() يضيف كلاهما مجموعًا اختباريًا، بحيث يمكن التحقق من سلامة الأرشيف، وهو ما يمكن أن يكون مفيدًا على طرق النقل والتخزين غير الموثوقة.إذا تم تخزين كل شيء محليًا ولا تحتاج إلى أي بيانات وصفية إضافية gzdeflate() يكفي.بالنسبة للتنقل أنصح به gzencode() (تنسيق GZIP) والذي ربما يكون مدعومًا بشكل أفضل من gzcompress() (تنسيق ZLIB) من بين أدوات أخرى.

عند ضغط سلاسل قصيرة جدًا، يصبح الحمل لكل طريقة مناسبًا نظرًا لأنه بالنسبة للمدخلات القصيرة جدًا، يمكن أن يشتمل الحمل الزائد على جزء كبير من المخرجات.مقدار الحمل لكل طريقة، والذي يتم قياسه عن طريق ضغط سلسلة فارغة، هو:

  • gzencode('') = 20 بايت
  • gzcompress('') = 8 بايت
  • gzdeflate('') = 2 بايت

نصائح أخرى

أنا لست خبيرًا في PHP ولا أستطيع الإجابة على السؤال المطروح، ولكن يبدو أن هناك الكثير من التخمينات الجارية هنا، ويتم تقديم معلومات غامضة.

DEFLATE هو اسم خوارزمية الضغط المستخدمة بواسطة ZLIB وGZIP وغيرهما.من الناحية النظرية، يدعم GZIP خوارزميات الضغط البديلة، ولكن من الناحية العملية، لا يوجد أي منها.

لا يوجد شيء اسمه "خوارزمية GZIP".يستخدم GZIP خوارزمية DEFLATE، ويضع إطارًا للبيانات حول البيانات المضغوطة.باستخدام GZIP، يمكنك إضافة أشياء مثل اسم الملف، ووقت الملف، وCRC، وحتى التعليق.تعتبر هذه البيانات الوصفية اختيارية، والعديد من أدوات gzipers تحذفها.

ZLIB مشابه، إلا أنه يحتوي على مجموعة مختلفة ومحدودة من البيانات التعريفية ورأس محدد من 2 بايت.

هذا كله موجود في IETF RFCs 1950, 1951, ، و 1952.

إن القول بأن "خوارزمية gzip تضغط بشكل أفضل من DEFLATE" هو مجرد هراء.لا توجد خوارزمية gzip.والخوارزمية المستخدمة بتنسيق GZIP هو انكماش.

جميع الأساليب هي نفسها بشكل أساسي، والفرق بينها يكمن في الغالب في الرؤوس.أنا شخصيًا سأستخدم gzencode، وهذا سينتج عنه مخرجات تساوي استدعاء سطر الأوامر للأداة المساعدة gzip.

اضطررت إلى فك ضغط ملف مضغوط بتنسيق gzip في PHP باستخدام C++.اكتشفت أن PHP gzencode ونظيره gzdecode استخدم ال Z_NO_FLUSH يتم تطبيق الطريقة وفي نهاية كتلة البيانات المراد تشفيرها/فك تشفيرها Z_FINISH.يمكن استخدام المثال/البرنامج التعليمي بلغة C الموضح على موقع zlib لفك ضغط ملفات gzip وضغطها من PHP، طالما تم تغيير بت windows ومستوى الذاكرة للسماح بانكماش gzip وتضخمه.

إضافي:يبدو أن معظم الأشخاص في هذا الموضوع ليس لديهم أي فكرة عما تعنيه "طريقة الضغط".

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