অ্যাপাচে জিজিপ কম্প্রেশন সক্ষম হলে সামগ্রী-দৈর্ঘ্য প্রেরণ করা হয় না?


13

আমি এই অ্যাপাচি আচরণটি বুঝতে কিছুটা সাহায্যের সত্যই প্রশংসা করব।

আমি অ্যাপ্লিকেশন / জসনের আইফোন অবজেক্টিভ-সি অ্যাপ্লিকেশন থেকে পিএইচপি-তে যোগাযোগ করছি। Gzip সংক্ষেপণ সার্ভারে সক্ষম করা হয়েছে এবং ক্লায়েন্টের দ্বারা অনুরোধ করা হয়েছে।

আমার .htaccess থেকে:

AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php application/json

ছোট অনুরোধগুলির জন্য, অ্যাপাচি 'সামগ্রী-দৈর্ঘ্য' শিরোনাম সেট করছে। উদাহরণস্বরূপ (এই মানগুলি শিরোনাম থেকে উদ্দেশ্য-সি আউটপুট হয়):

Connection = "Keep-Alive";
"Content-Encoding" = gzip;
"Content-Length" = 185;     <-------------
"Content-Type" = "application/json";
Date = "Wed, 22 Sep 2010 12:20:27 GMT";
"Keep-Alive" = "timeout=3, max=149";
Server = Apache;
Vary = "Accept-Encoding";
"X-Powered-By" = "PHP/5.2.13";
"X-Uncompressed-Content-Length" = 217;

এক্স-আনপ্রেসড-কন্টেন্ট-দৈর্ঘ্যটি শিরোনামটি আমি সংকুচিত JSON স্ট্রিংয়ের আকারের সাথে যুক্ত করছি।

আপনি দেখতে পাচ্ছেন, এই অনুরোধটি খুব ছোট (217 বাইট)।

বৃহত্তর অনুরোধ (282888 বাইট) থেকে শিরোনাম এখানে দেওয়া হয়েছে:

Connection = "Keep-Alive";
"Content-Encoding" = gzip;
"Content-Type" = "application/json";
Date = "Wed, 22 Sep 2010 12:20:29 GMT";
"Keep-Alive" = "timeout=3, max=148";
Server = Apache;
"Transfer-Encoding" = Identity;
Vary = "Accept-Encoding";
"X-Powered-By" = "PHP/5.2.13";
"X-Uncompressed-Content-Length" = 282888;

লক্ষ্য করুন যে সামগ্রী-দৈর্ঘ্য দেওয়া হয়নি।

আমার প্রশ্নগুলো:

  1. কেন আপাচি বৃহত্তর অনুরোধের জন্য সামগ্রী-দৈর্ঘ্য প্রেরণ করে না?
  2. 'কনটেস্ট-এনকোডিং = জিজিপ' সেট করা হয়েছে এর অর্থ কি গিজিপ সংক্ষেপণ বৃহত্তর অনুরোধে এখনও কাজ করছে, যদিও আমি আকারের পার্থক্য যাচাই করতে পারি না?
  3. ব্যবহারকারীদের ডেটা ব্যবহারের আরও সঠিকভাবে রিপোর্ট করার জন্য এই বৃহত্তর অনুরোধগুলির জন্য প্রকৃত সামগ্রী-দৈর্ঘ্য অন্তর্ভুক্ত করার জন্য আমি কী অ্যাপাচি পাব?

এই অ্যাপ্লিকেশনটি ব্যয়বহুল এমন ডেটা পরিকল্পনাগুলিতে ব্যবহার করা যেতে পারে, অতএব 30-70% স্ফীতভাবে ব্যবহার না করে ব্যবহারকারীর কাছে আসল ব্যবহারের প্রতিবেদন করার আমার ইচ্ছা (কয়েকশ অতিরিক্ত অতিরিক্ত কেবি খুব বেশি নাও লাগতে পারে - তবে এই পরিকল্পনাগুলি $ 1 এর মধ্যে ব্যয় করতে পারে এবং এমবি প্রতি 10 ডলার!)।

আগাম ধন্যবাদ.

উত্তর:


14

মার্টিন এফজর্ডওয়াল্ডসের উত্তরটিতে যোগ করুন:

সংক্ষিপ্ত ফাইলের আকার DeflateBufferSize এর চেয়ে বড় হলেই অ্যাপাচি ছিটেড এনকোডিং ব্যবহার করে। এই বাফার আকারটি বৃদ্ধি করা তাই বড় ফাইলগুলির জন্য চঙ্কিত এনকোডিং ব্যবহার করে সার্ভারকে আটকাবে, যার ফলে সামগ্রী-দৈর্ঘ্য এমনকি জিপ করা ডেটার জন্য প্রেরণ করা হবে।

আরও তথ্য এখানে উপলব্ধ: http://httpd.apache.org/docs/2.2/mod/mod_deflate.html#deflatebuffersize


সুন্দর. এই সমস্যাটি সমাধানের এটি সম্ভবত দ্রুততম উপায়। কারও যদি উচ্চতর স্তরের কাস্টমাইজেশন প্রয়োজন হয় (যেমন, কিছু অনুরোধগুলি অন্যদের নয়) তবে ম্যানুয়াল সমাধানের জন্য আমার উত্তর সার্ভারফল্ট.com/ a/ 183856/54957 দেখুন ।
উইলিয়াম ডেনিস

7

অ্যাপাচি মতো শঙ্কিত এনকোডিং করছে এমন শোনার অর্থ, এটি জিপিড হওয়ার সম্পূর্ণ প্রতিক্রিয়া অপেক্ষা না করে বরং জিপ করা হচ্ছে বলে এটি ডেটা প্রেরণ করতে পারে। এটি মোটামুটি স্ট্যান্ডার্ড অনুশীলন, যদিও অ্যাপাচি এটি অক্ষম করা যায় কিনা তা বলতে আমি যথেষ্ট পরিচিত নই।


তথ্যের জন্য ধন্যবাদ, আপনি আমাকে সঠিক দিকে নির্দেশ করেছেন এবং আমি এটি সমাধান করেছি।
উইলিয়াম ডেনিস

স্বীকার করা হয়েছে। এই প্রশ্নটি যদিও যে কেউ পড়ছেন তাদের জন্য - দয়া করে বিস্তারিত সমাধানের জন্য আমার উত্তরটি পড়ুন। মূলত, আপনি ম্যানুয়ালি উত্তরটি বাফার করে এবং সংকুচিত করে (এবং এইভাবে শূন্য সামগ্রীর দৈর্ঘ্য) এড়াতে পারবেন না।
উইলিয়াম ডেনিস

এটি কিছুটা বিভ্রান্তিকর যে স্বীকৃত উত্তরটি মূল প্রশ্নের উত্তর নয়, বরং এমন কিছু যা আপনাকে এটি পেতে সহায়তা করেছিল। জিনিসগুলিকে আরও কিছুটা পরিষ্কার করার জন্য আপনার নীচের পোস্ট করা উত্তরটি গ্রহণ করা উচিত।
redbmk

@redbmk ফেয়ার পয়েন্ট, আমি কেবল অকৃতজ্ঞ হতে চাই না। ফিলিপ আসলে এই জন্য নিখুঁত সহজ ফিক্স আছে, তাই আমি তার উপর আমার গ্রহণ।
উইলিয়াম ডেনিস

5

ঠিক আছে, আমি এটি সমাধান করতে পেরেছি। মার্টিন এফ যেমন সঠিকভাবে উল্লেখ করেছেন, অ্যাপাচি উত্তরটি ছাঁটাই করছে যাতে সামগ্রীর আকার জানা যায় না। অনেক লোকের জন্য এটি কাঙ্ক্ষিত (দ্রুত পৃষ্ঠা লোড)। এটি ডাউনলোডের অগ্রগতিটি রিপোর্ট করতে না পারার ব্যয়ে আসে।

আমার মতো যারা সত্যিই ডাউনলোডের অগ্রগতি সম্পর্কে প্রতিবেদন করতে চান, আপনি যদি আপাচি বা পিএইচপি'র স্বয়ংক্রিয় গিজিপ সমর্থন ব্যবহার করেন তবে আপনি খুব সামান্যই করতে পারেন। সমাধানটি হ'ল ম্যানুয়ালি করা। এটি যত শোনাচ্ছে তার চেয়ে সহজ:

আপনি যদি পুরো ফাইলগুলি প্রেরণ করেন তবে পিএইচপি-র একটি একক অংশকে (বিষয়বস্তু-দৈর্ঘ্যের সাথে) জোর করানোর জন্য এটি একটি দুর্দান্ত উদাহরণ: http://www.php.net/manual/en/function.ob-start.php # 94741

যদি আপনি উত্পন্ন ডেটা প্রেরণ করেন তবে উপরের নমুনার মতো আপনার ডেটা এনকোড করতে জেনকোড ব্যবহার করুন। একটি পূর্ব-প্রয়োজনীয়তা হ'ল আপনার সমস্ত আউটপুট ডেটা একটি ভেরিয়েবেলে সংরক্ষণ করা হয় (আপনি যদি বাফার প্রয়োজন হয় তবে এটি সাহায্য করার জন্য আপনি ob_start ব্যবহার করতে পারেন, তারপরে বাফার সামগ্রীগুলি পান)।

        // $replyBody is the entire contents of your reply

        header("Content-Type: application/json");  // or whatever yours is

        // checks if gzip is supported by client
        $pack = true;
        if(empty($_SERVER["HTTP_ACCEPT_ENCODING"]) || strpos($_SERVER["HTTP_ACCEPT_ENCODING"], 'gzip') === false)
        {
            $pack = false;
        }

        // if supported, gzips data
        if($pack) {
            header("Content-Encoding: gzip");
            $replyBody = gzencode($replyBody, 9, FORCE_GZIP);
        }

        // compressed or not, sets the Content-Length           
        header("Content-Length: " . mb_strlen($replyBody, 'latin1'));

        // outputs reply & exits
        echo $replyBody;
        exit;

ও ভয়েলা!

এটি নিজে করার আরও একটি বড় সুবিধা হ'ল আপনি সংক্ষেপণের স্তরটি সেট করতে পারেন। এটি আমার মোবাইল অ্যাপ্লিকেশনটির জন্য দুর্দান্ত, কারণ আমি সর্বোচ্চ সংকোচনের স্তরে সেট করতে পারি (সুতরাং আমার ব্যবহারকারীরা ডেটার জন্য কম অর্থ প্রদান করে!) - যদিও সার্ভারটি সম্ভবত আরও ভাল সিপিইউ / আকারের বাণিজ্য বন্ধের জন্য একটি মাঝারি সংক্ষেপণ স্তর ব্যবহার করে। সংকোচনের মাত্রা এমন কিছু যা আমি বিশ্বাস করি আপনি কেবল তখনই পরিবর্তন করতে পারবেন যদি আপনি httpd.conf সম্পাদনা করতে পারেন (যা ভাগ করে নেওয়া হোস্টিংয়ের ক্ষেত্রে আমি করতে পারি না)।

সুতরাং আমি আমার ডিফল্ট .htaccess নির্দেশিকা সমস্ত কিছুর জন্য রেখেছি কিন্তু আমার অ্যাপ্লিকেশন / জেসন জবাব দেয় যা আমি এখন উপরের উপায়ে এনকোড করেছি।

ধন্যবাদ আবার মার্টিন এফ, আপনি আমাকে এটি সমাধান করার জন্য প্রয়োজনীয় স্পার্কটি দিয়েছিলেন :)


1
ঘটনাক্রমে, জেএসএন ডেটার সাথে সঞ্চয়গুলি (ভারী পুনরাবৃত্তি কীগুলির সাথে) বিশাল , এক ক্ষেত্রে 77% হ্রাস। এটি এমবি প্রতি 1 ডলারে একটি বড় চুক্তি ...
উইলিয়াম ডেনিস

1
আপনি সম্ভবত strlen($replyBody)পরিবর্তে ব্যবহার করা উচিত mb_strlen($replyBody, 'latin1')। সামগ্রীর দৈর্ঘ্য কেবলমাত্র বাইটের সংখ্যা (অক্ষর নয়) যা স্ট্রেন () আপনাকে দেয়। ল্যাটিন 1 অক্ষর সর্বদা 8 বিট থাকায় 'ল্যাটিন 1' ধরণের কাজের সাথে এমবি_স্ট্রেলেন () ব্যবহার করে তবে এটিতে এনকোডিংগুলির সাথে সমস্যা থাকতে পারে যা বাইট তৈরি করে যা বৈধ ল্যাটিন 1 অক্ষর নয়।
অরর্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.