تعین میزان فشرده سازی محتوای صفحه
دست آورد دیگری از گروه گوگل 724
دست آورد دیگری از گروه گوگل 724
بررسی روشهای متنوع فشرده سازی خودکار مطالب در php
منظور از فشرده سازی خودکار فشرده سازی توسط سیستم عامل سرور می باشد یعنی بدون اینکه شما نیازی به فشرده کردن محتوا در کدهای خودتان با توابع PHP داشته باشید مدیریت آن را به آپاچی بسپارید
آپاچی را طبق متد دیفلت یا RFC 1951 - DEFLATE Compressed Data Format Specification version پیکربندی کنید
تعجب نکنید مبحثی که می خواهم باز کنم چیز پیچیده و غامض نیست بلکه بیشتر می خواهم یکی از نکاتی را باز کنم که به درست کار نکردن کش تنظیم شده شما مربوط میشود
برای شما از VARY در شرایط کش شدن یک صفحه سایت گفتم و توضیح مختصری از آن دادم
در اینجا vary را بیشتر می خواهم بازکنم تا مطلب بیشتر برایتان جا بیفتد
vary به طور خلاصه به واکنش ها در برابر محتوا اشاره دارد
وقتی تمام آن را خواندید متوجه می شوید که Vary از مواردی است که به سرور شما مربوط می شود تا فایلهای سایت تان پس اگر سرور اختصاصی ندارید یا دسترسی به تنظیمات سرور ندارید نیازی به خواندن آن پیدا نمی کنید
یکی از ارزنده ترین کاربردهای vary در پروکسی هایی است که همه چیز را کش می کنند(یک مثال از پروکسی گفته شده ISP ها هستند)
فرض کنید شما مطلبی را می خوانید که سرور آن را به دو صورت gzip شده و فشرده نشده بسته به پشتیبانی مرورگر می فرستد
حال فرض کنید مرورگر شما gzip را پشتیبانی می کند (در 90 درصد مواقع چنین است) پس سرور مطلب را بصورت gzip یا فشرده می فرستد
ISP هم در بین راه مطلب را ابتدا کش می کند وبعد برای شما می فرستد
حال کاربر دیگری با ارایه آدرس اینترنتی یکسان همان مطلب را از سرور در خواست می کند با این تفاوت که مرورگرش gzip را پشتیبانی نمی کند
حال ISP بین راه وقتی درخواست را می بیند و می بیند که آن را بر اساس آإرس اعلام شده در کش خودش دارد کش را برای این کاربر بی خبر از همه جا می فرستد
و چون مرورگر او gzip را پشتیبانی نمی کند تنها یک سری حروف عجق وجق می بیند
در نتیجه فکر می کند از منبع ایراد وجود دارد
برای اجتناب از خطاهای از این دست VARY تعریف شد
در حالت فشرده vary در اکثر سرور ها بصورت * "user-agent"
و در حالت غیر فشرده بصورت * "accept-encoding, user-agent"
در می اید
تا اینجای کار همه چیز درست است و دیگر ISP ها دچار آن اشتباه مهلک نمی شوند
ولی مشکل اینجاست که اینبار مرورگر دچار مشکل شده و نمی تواند تفاوتی بین حالت فشرده شده و غیر آن قائل شود در نتیجه کش را مورد استفاده قرار نمی دهد
چرا که در حالت فشرده و غیر آن دو نوع VARY دریافت کرده
برای رفع این مشکل توصیه می شود که در هر دوحالت از vary حالت فشرده یعنی
* "user-agent"
استفاده شود
پاسخ به چند سوال مطرح شده از سوی کاربران
حتما برای شما هم این سوال پیش آمده که چرا کسانی که مطالب ما را کپی می کنند بالاتر قرار می گیرند
من در پست الگوریتم پاندا گوگل پاسخ ان را داده ام
مثلا کاربر در سایت شما با دیدن مطلب رغبتی به خواندنش نشان ندهد (مثلا انتخاب فونت بد یا قالب افتضاح سایت و یا ...) اما در سایت رقیب همه چیز مهیا شده که کاربر در کنار خواندن مطلبی که با جستجویش وارد سایت شده، مطالب دیگری را هم بخواند و همین یعنی امتیاز در الگوریتم پاندا گوگل پس چاره کار در این است که به گوگل بفهمانیم که مطلب متعلق به شماست اینطور کاربران همه سایت شما را می بینند و زرق وبرق سایت متخلف در کپی از سایت شما جایگاهی پیدا نمی کند با این مقدمه سوال دوست عزیز را مطرح می کنم
کمتر پیش میاید که بخواهیم مقادیر ایجاد شده از یک فرم را کش کنیم چرا که معمولا مقادیر فرم دل بخواه تغییر می کند و اکثرا اطلاعات شخصی و محرمانه است
اما گاه پیش میاید که می خواهیم مقادیر کش شود چرا که نه محرمانه است و نه شخصی
در نظر بگیرید پیش بینی آب و هوا را
خوب وقتی آب و هوای امروز تهران 10 درجه بالای صفر اعلام شده اگر کاربر یکساعت دیگر هم در فرم پیش بینی آب و هوا تهران را انتخاب کرد باز نتیجه همان 10 درجه بالای صفر خواهد بود
همانطور که قبلا گفته شد پروتکل HTTP طوری نوشته شده که تنها مرورگرها اجازه کش کردن متد GET را دارند
در مواردی که فرم ما با متد post نوشته شده به روش جاوا اسکریپتی می توان بصورت GET با آن برخورد کرد تا مقادیر را به درستی کش کند
کافیست با استفاده از پلاگین جیکوئری jquery و ترفند های جاوا اسکریپتی (قرار دادن onsubmit و فرارخوانی کد زیر) فرم را بصورت Post ارسال کنیم
$.get(
"form.php",
{param1 : 1, paramX : "abc"},
function(data) {
alert("page content: " + data);
}
);
کدخط بالا از لینک مقابل برداشته شده است در صورتیکه نیاز به استفاده از این ترفند برای کش کردن فرم با متد POST در صفحات دارید حتما لینک مقابل را ببینید
اهدافی که ما از کش کردن محتوا داریم عبارتند از
Pragma:
no-cacheIf-Modified-Since:
datetimeIf-None-Match:
etagvalueدر حالت کش استاتیک ارسال هدر از هیچ نوع را نداریم
مطلب برداشت آزادی بود از مطلب:
Internet Explorer"s Cache-Control Extensions
گفتیم که کش کردن محتوا نقش زیادی در بالا بردن سرعت بارگذاری صفحه دارد اما مواردی هم هست که نباید محتوا را کش کرد
به عبارتی به برخی دلایل و صلاحدیدهای امنیتی نباید خیلی اصرا به کش محتوا داد و در مواردی با تمهیدات لازم را دید(علی الخصوص در مواردی که از CDN استفاده شده است)
Vary: negotiate,accept-language,accept-charset
را داشته باشیم تا بتوان بر اساس زبان یا انکدینگ انتخابی زبان یا سایر انتخاب های محلی درخواست کش را به مرورگر داد
چرا که مرورگر ها قادرند بر حسب vary کش را مدیریت کنند
نکته:
Vary: negotiate به معنای وضعیت مذاکره است مثلا ارسال فرم و امثالهم که مرورگر باید از کش صفحه بپرهیزد
شاید برایتان پیش آمده باشد که همه تنظیمات را در کش سرور و مرورگر اعمال کرده اید اما آخر هم به یک کش پایدار و مطمئن نرسیده اید
این از اون مواردی است که بقولی به آن فوت کوزه گری می گویند من ده مورد از آنها را در زیر می اورم و پیدا کردن الباقی را به خودتان وا می گذارم
1- هدر های expire (تاریخ انقضا) و max-age (طول عمر) modify (زمان آخرین تغییر) توسط سرور ارسال شود
اگر فایلهای کش شده مبتنی بر شناسایی بر اساس ETAG باشند هدر شرط برای بررسی کش "If-None-Match" می باشد
اما اگر ما ETAG را غیر فعال کرده باشیم شرط بررسی کش از هدر ارسال شده توسط مرورگر "If-Modified-Since" می باشد
بسته به اینکه کدام هدر از مرورگر ارسال شده باشد پاسخ دریافتی از سرور نیز باید متفاوت باشد
اگر با شرط "If-Modified-Since" کش مرورگر شناخته شد به عبارتی در حالت فعال بودن ETAG در پاسخ آن سرور اگر کش معتبر باشد هدر 304 یا "304 Not Modified" را می فرستد بدون محتوا (یعنی هیچ خروجی متنی در کار نخواهد بود.) اما اگر مشخص شد که کش ملغی شده در پاسخ هدر 200 با محتوای کامل درخواستی ارسال میشود
ولی با خاموش کردن etag اگر ما بتوانیم ماهیت کش استاتیک را ایجاد کنیم (ارسال هدر expire مثلا با مود expire در آپاچی ) دیگر مرورگر تا زمان اکسپایر شدن درخواست به مرورگر نمی فرستد
هدرهای شرطی یا مبتنی بر ETAG دو مزیت دارد
1- با تغییر مشخصه فایل خودبخود فایل جدید به مرورگر ارسال می شود
2- پهنای باندی مصرف نمی شود
اما هدرهای استاتیک تنها مزیت دوم را دارند و اگر به هردلیلی فایل تغییر کند نمی توان به مرورگر این را فهماند
ضمنا این موارد را از طریق تست با ابزار فایرباگ یا کروم نمی توان بررسی کرد و تنها http://www.webpagetest.org آزمون مطمئنی برای کش و بررسی تفاوتهای گفته شده بین کش شرطی و استاتیک خواهد بود
در مبحث بعدی به این موضوع خواهیم پرداخت که چه چیزهایی را نمی توان کش کرد