وبلاگ فيکسل برای گرافيست ها
SharpLife وبلاگ شخصی مهدی تقی زاده
بازگشت شاهو طوفانی
اين صداگذاری و ميکس آخرشه!
نکته جالبی در مورد تابع output_add_rewrite_var
کاراکتر های فارسی در عکس توسط PHP
مصاحبه من با مجله وزین IranAMP
واژه های فناوری اطلاعات و برابر های پیشنهادی فرهنگستان
دوره های آموزش IT
استانداردهای کدنويسی PHP
| صفحه قبل


IranPHP
نماينده رسمي سايت PHP.net

webilix
منبعي براي برنامه نويسان PHP

phprun
وبلاگي خواندني براي تمام PHP كارها

ם تعداد بازديدكنندگان
كل: 924765
ديروز: 915
امروز: 815
ם تعداد كاربران آنلاين
4 نفر
ם پنج مراجعه آخر
okpoyei.is.com
xcfgykful.chez.com
msedjhtf.keep.pl
xcfgykful.chez.com
vogar5c.cm.to
 
 
فشرده سازی محتوا
PHP.JET همونطور که احتمالا متوجه شديد، دو سه روزی هست سايت سريعتر از اون چيزی که قبلا بود، بارگذاری و نمايش داده ميشه. البته کاری با تصاوير سايت ندارم، ولی کلا با وارد کردن URL سايت در نوار آدرس مرورگرتون، محتوای سايت يا بهتر بگم متون سايت و لایوت صفحه، خيلی سريعتر ظاهر ميشه. اين بهبود کارايی بنا به تحليل اين سايت، ۴۴۴ درصد برآورد ميشه. (البته این اطلاعات رو قبل از اعمال این تکنیک نشون میده) از طرفی هم در پهنای باند من صرفه جويی عظيمی صورت ميگيره و هم شما به سرعت می تونيد سايت رو در پنجره مرورگرتون ببينيد. البته در زمان دريافت بسته های داده مربوط به سايت، CPU شما به مقدار کمی از حالت تنبلی خارج ميشه و شروع به خارج کردن محتوا از بسته های فشرده شده ارسالی می کنه. اندازه معمول خروجی HTML این سایت، که بعد از تفسير کدها توسط سرويس دهنده به سمت شما که کلاينت باشی فرستاده ميشه حدود ۶۴ کيلوبايت هست. با روش فعلی من تنها ۱۲ کيلوبايت برای شما ارسال می کنم. می بينم که بعضيا چشماشون shocked شده و علاقه مند هستند که نحوه کار و تکنيک پشت پرده رو بدونند.
همونطور که می دونيد HTTP قراردادی بين سرویس گیرنده(Client) و سرویس دهنده(Server) است.
در HTTP نسخه ۱.۰ ما مفهومی داريم به نام Content Encoding يا فارسی اش ميشه رمزگردانی محتوا. با استفاده از اين روش، کلاينت، سرويس دهنده را از اين موضوع مطلع می کند که قابليت هندل کردن محتوايی که به طرق معينی رمز شده اند را دارد. فشرده سازی محتوا به کوچکتر شدن محتوا منتج می شود که دو اثر قابل توجه دارد:
-) استفاده از پهنای باند کاهش می یابد، زیرا حجم کلی داده های ارسالی کم شده است. در بسیاری از شرکتها، پهنای باند از جمله هزینه های تکرار شونده می باشد.
-) تاخیر شبکه یا Network Latency هم کاهش می یابد. چرا؟! چون محتوای کوچکتر شده در بسته های کمتری جای می گیرد و در شبکه ارسال می شود.
اين مزايا، با زمانی که CPU برای انجام فشرده سازی صرف می کند، رنگ کمتری به خود می گيرد.(البته این زمان بسیار بسیار اندک است در حد چند میلی ثانیه) در يک آزمون واقعی که از فشرده سازی محتوا صورت گرفت(با استفاده از mod_gzip)، به اين نتيجه رسيدم که علاوه بر کاهش ۳۰ درصدی استفاده از پهنای باند، بازدهی کلی سایت هم بهتر میشه یعنی با فشرده سازی محتوا Throughput (صفحه/ثانیه) تقریبا ۱۰ درصد افزایش پیدا کرد. اگه این ۱۰ درصد برای شما کافی هم نباشه، هزینه صرفه جویی که در پهنای باند صورت میگیره وسوسه برانگیز هست.
وقتی کلاينت که اکثرا برنامه های مرورگر هستند، درخواستی برای دريافت يک صفحه وب می کنند، Headerهايی به سمت سرويس دهنده می فرستند که ضمن معرفی خود(نوع مرورگر)، قابليت هایی که پشتیبانی می کنند را هم به اطلاع سرویس دهنده می رسانند.
در اين Headerهايی که برای انجام درخواست، ارسال می شود، مرورگر شيوه فشرده سازی محتوایی را که می پذيرد، به صورت زير اعلام می کنند:

Content-Encoding: gzip,defalte

برای دستيابی و اجرای اين تکنيک در سمت سرويس دهنده، چندين راه وجود دارد. اگر PHP با پشتيبانی از zlib کامپايل شده باشد، (در زمان کامپایل گزینه enable-zlib- را اضافه کنید.) ساده ترين راه استفاده از gzip output handler است که Built-in يعنی از قبل روی سيستم سوار شده است. برای فعالسازی اين ويژگی، کافيست دستورالعملی را در فايل پيکربندی PHP يعنی php.ini تنظيم کنيد.

zlib.output_compression On

با فعال کردن اين دستورالعمل يا Directive در فايل php.ini، قابليتهای مرورگر متقاضی توسط Headerهايی که ارسال می کند، تشخيص داده شده و در صورتی که از امکان فشرده سازی محتوا پشتيبانی کند، بر طبق آن محتوا فشرده می شود، در غير اين صورت، صفحه وب بدون اعمال هيچگونه فشرده سازی به سمت کلاينت ارسال می شود. تنها خرده ای که ميشه به فشرده سازی محتوای PHP گرفت اينست که اين ويژگی تنها به روی صفحات توليد شده توسط PHP اعمال می شود.اگه سرويس دهنده شما تنها صفحات php را Serve می کنه، ديگه هيچ غمتون نباشه! در غير اين صورت، بايد برای رسيدن به اين مهم به ماجولهای Third-party آپاچی نظير mod_deflate و mod_gzip نگاهی بیاندازيد.
البته من تابع بسیار ساده ای برای اين کار نوشتم که همین کار رو انجام ميده و کافيه هر صفحه HTML رو از طريق يک صفحه واسطه php خوانده و اين تابع رو روی محتويات اعمال کنیم تا نتیجه همون چیزی بشه که می خواهیم. (البته مسلما باید خروجی رو بافر کنیم) فقط یادتون باشه اندازه محتوا و CRC32 رو هم به آخر محتوای فشرده شده اضافه کنید.(البته مرورگرها، اگه ۴ بایت آخر رو حذف نکنید و دو تا چیزی که گفتم اضافه نکنید، بازم کارشون رو درست انجام میدن ولی بهتره استانداردها رو رعایت کرد!)
نکات (اشاره ضمنی):
-) gzip از همون الگوریتم فشرده سازی Zip استفاده میکنه. فکر کنم LZ777 ها؟!(اگه اشتباه می کنم، تذکر بدید) اما تفاوت اونها اینه که gzip تنها یک فایل رو فشرده میکنه.
-) بسته به سطح فشرده سازی که تعیین می کنید،(سطح فشرده سازی اینجا رو ۹ گذاشتم) زمان بیشتری از CPU گرفته میشه که بازم ناچیزه!
-) کاربران ویندوز توجه: از نسخه 4.3.0 به بعد پشتیبانی از zlib بصورت توکار تعبیه شده است.(همون Built-in رو میگم!)
-) با استفاده از ForceType کاری کنید که با فایلهای HTML، مانند اسکریپتهای php رفتار بشه تا بتونید بدون ماجول اضافی، این تکنیک رو روی این فایلها هم اعمال کنید.
-) مرورگری نداریم که از deflate پشتیبانی کنه اما از gzip نه! smile
-) در حال حاضر، 80.8۰ درصد، حجم خروجی این صفحه ای که مشاهده می کنید، کمتر شده است! باور نداری؟! از PipeBoost بپرس!
-) mod_deflate رو برای نسخه ۱.۳ آپاچی، از اينجا دریافت کنید. البته این ربطی به mod_deflate نسخه ۲ آپاچی نداره. مستند این پروژه به زبان روسی تهیه شده است.
-) mod_gzip توسط Remote Communication توسعه یافته است، اما در حال حاضر این پروژه، خانه جدیدی در Sourceforge به خود اختصاص داده است.[...]
-) نکته دیگری اگه شما می دونید، اضافه کنید.
ASP.JET پ.ن: سهيل مدتی هست که يک ماجول نوشته برای اپليکيشنهای ASP.NET که دقيقا همين کار رو انجام ميده و لطف کرده و نمونه ای از اون رو به ما داده و ما روی ديجيتال پرشيا نصب کرديم. توضيحات سهيل رو در معرفی برنامه ASP.JET اينجا بخونيد. اين مطلب رو به اين خاطر عنوان کردم که تکنيکی که سهیل به کار برده، توسط خود PHP پشتيبانی ميشه و نياز به ماجول يا اکستنشن خاصی نيست. ولی مشتريان ويندوز حتما به ASP.JET سهيل نیاز خواهند داشت. wink
 
نظرات شما(92)  
موتور ذخيره سازی MyISAM(قسمت تکمیلی)
MyISAM برای کنترل عملياتهای همزمان، MyISAM از مکانيزم قفل گذاری در سطح جدول استفاده می کند. وقت بيشتری برای توضيح اين مکانيزم می گذارم چون اغلب درک درستی از آن نيست.
در حقيقت، سه نوع قفل در MyISAM وجود دارد.
قفل READ LOCAL: اين نوع قفل، توسط پرس و جوهایی(Query) که تنها به خواندن نياز دارند، استفاده می شود، يعنی صرفا عمليات به هنگام سازی(Update) را بلاک می کند تا از تغيير داده ها به هنگام خواندن جلوگيری کند. ساير پرس و جوهای خواندن و درج های همزمان هم قابل انجام هستند؛ اگر يک دستور INSERT بتواند داده جديدی را به آخر فايل MYD. اضافه کند به جای اينکه فضاهای خالی حاصل از عمليات DELETE را پر کند، ديگر منتظر قفل از نوع READ LOCAL نمی ماند.
READ يا قفلهای اشتراکی: اين نوع قفل گذاری، عملياتهای به هنگام سازی و تمام عملياتهای درج را مسدود می کند. اين نوع قفل عموما وقتی استفاده می شود که يک ابزار خارجی نظیر myisamcheck نيازمند دسترسی مستقيم به فایل يک جدول است.
WRITE يا قفلهای انحصاری: اين نوع قفل توسط عملياتهای حذف(DELETE) و به هنگام سازی(UPDATE) و گاهی اوقات هم دستورات درج(INSERT) استفاده می شود. ساير دسترسی ها به جدول مربوطه اعم از خواندن و نوشتن، مسدود می شوند تا به هنگام سازی ها دچار اختلال نشوند.
منظور ما از Blocking يا مسدود سازی اينست که يک Thread يا اتصال ممکن است منتظر کامل شدن عملیاتهای Thread ديگر و رهاسازی قفلی که روی جدول گذاشته است، بماند. در حاليکه اين امکان وجود دارد که به صورت دستی قفلها را قرار دهیم، خود سرويس دهنده MySQL بطور ضمنی، قفل گذاری های لازمه را برای اجرای هر دستوری که اجرا می کند، اعمال می کند.
MyISAM از Transaction يا تراکنش پشتيبانی نمی کند. در نتيجه، اين قالب ذخيره سازی در مد AUTOCOMMIT=1 عمل می کند که هر دستور، اتميک است. دقت داشته باشيد، MyISAM به ساختارهايی نظير INSERT ... SELECT و CREATE TABLE ... SELECT به چشم يک دستور نگاه می کند.
MyISAM با معماری ساده ای که دارد، کارايی بالاتر و سرريز(Overhead) کمتری را از لحاظ حافظه و بکارگيری ديسک دارد.
تهيه نسخه پشتیبان از اين جداول توسط ابزار mysqldump که ساختار و داده ها را به صورت دستورات SQL ذخیره می کند و برنامه mysqlhotcopy(نسخه باینری از فایلهای جدول) امکان پذير است. هر دوی اينها روی جدولی که قرار است از آن نسخه پشتيبان گرفته شود، قفل اشتراکی می گذارند. در صورت وجود رابطه بين جداول، قفل اشتراکی ديگری برای اطمينان از صحت اطلاعاتی نسخه پشتيبان مورد نياز است. در هنگام بروز مشکل، جداول با قالب سطر ثابت خيلی آسان تر قابل بازيابی هستند؛ زيرا ابزارهای بازيابی، دقيقا طول هر رکورد و نقطه شروع آن را می دانند. در صورت خرابی سيستم، عموما شاخص ها تحت تاثير قرار می گيرند که می توان دوباره اين شاخصها را ساخت. البته برای جدوال بزرگ، دوباره سازی شاخصها، زمان قابل توجهی را به خود اختصاص می دهد.
MyISAM MERGE
يک جدول MyISAM MERGE، خودش، هيچ داده ای ندارد، اما در عوض به چندين جدول MyISAM یکسان اشاره می کند. هر پرس و جو از جدول ادغامی، ممکن است روی یک یا چند جدول دیگر اعمال شود که از لحاظ کارکرد مشابه UNION VIEW است.
برای نمونه، ادغام کردن جداول وقتی استفاده می شود که بخواهيم داده های دوره ای را که در چندين جدول ذخيره می شود را تحليل کنيم. ذخيره چنین داده هایی در يک جدول هم از لحاظ اندازه و هم جنبه مدیریتی و پشتیبان گیری غير عملی است.

CREATE TABLE sales200401
        (saleid INT UNSIGNED NOT NULL PRIMARY KEY,
         dt DATETIME, INDEX (dt)) ENGINE=MyISAM;
  CREATE TABLE sales200402
        (saleid INT UNSIGNED NOT NULL PRIMARY KEY,
         dt DATETIME, INDEX (dt)) ENGINE=MyISAM;
  CREATE TABLE sales2004
        (saleid INT UNSIGNED NOT NULL PRIMARY KEY,
         dt DATETIME, INDEX (dt))
        ENGINE=MERGE UNION=(sales200401,sales200402);


 
نظرات شما(66)  
موتور ذخيره سازی MyISAM
MyISAM Storage engine در مطلب قبلی به بررسی ISAM که يک Storage Engine يا Database Engine يا راحتر بگیم Table Type منسوخ شده ای که در MySQL به کار گرفته می شود، صحبت کرديم. امروز به بررسی موتور ذخيره سازی MyISAM که اکثر جداول ما لااقل قبل از نسخه ۴، بر پايه همين نوع است می پردازم.
MyISAM فرمت توسعه یافته ISAM است که از نسخه ۳.۲۳ به بعد MySQL، موتور ذخيره سازی پيش فرض هم می باشد؛ يعنی با ساخت يک جدول با استفاده از دستور CREATE TABLE، اگر در آخر، نوع جدول مشخص نشود، خود MySQL نوع MyISAM را بر می گزيند. علاوه بر تدارک امکانات شاخص گذاری و مدیریت فیلدهای اطلاعاتی که در ISAM وجود نداشت، MyISAM از مکانیزم قفل گذاری در سطح جدول بهره می برد که امکان عملیاتهای خواندن و نوشتن همزمان را میسر می سازد. نکته ای که در رابطه با جداول از اين نوع وجود دارد، اينست که هر چند وقت يکبار باید با اجرای فرمان OPTIMIZE TABLE، فضای هرزه يا به قولی گپ(GAP) حاصله از انجام عملیاتهای بروز رسانی را بازیابی کرد.
MyISAM با تکیه بر اينکه عملياتهای خواندن را سريعتر انجام می دهد، شايد مهمترين دليل محبوبيت و مقبول عام قرار گرفتن MySQL در حيطه فعاليتهای توسعه وب است. البته هنگاميکه بدانيم، اکثر قريب به اتفاق عملياتهای ما، خواندن است.
کمی تخصصی تر وارد قضيه بشيم. من هميشه دوست دارم که معماری و به قول معروف Infrastructure تکنولوژی که با اون سرکار دارم رو بدونم، چون در درک بهتر اون فن آوری کمک شايانی می کند.
با موتور ذخيره سازی MyISAM با ايجاد هر بانک اطلاعاتی(Database) يک دايرکتوری هم در شاخه Data در ريشه پوشه MySQL ساخته می شود.(با توجه به تنظیمات پیش فرض؛ چون می شود داده ها را در محل دیگری غیر از این شاخه ذخیره کرد.)
و هر جدول در مجموعه جداگانه ای از فايلها ذخيره می شود. برای هر جدول، یک فایل با پسوند frm. که حاوی اطلاعاتی در مورد ساختار جدول است - این فایل در واقع شمای داخلی دستور CREATE TABLE هست. - فایل با پسوند MYD. که دارای داده های خام جدول است و فایل دیگر با پسوند MYI.حاوی شاخصهایی است که به جدول مذکور متعلق است و برخی اطلاعات آماری مربوط به جدول را هم در خود دارد. فایل داده صرفا دارای داده های سطر است که حداقل Overhead را دارد.
Symlink کردن يک دايرکتوری بانک اطلاعاتی، شيوه رايجی است و برای ذخيره سازی داده ها در ديسک يا پارتيشن ديگری صورت می گيرد که حال اين کار هم به دليل پرفورمنس يا کارآيی بيشتر و هم ايمنی و امنيت انجام می گيرد.
از نسخه ۴.۰ به بعد Symlink کردن هر جدول هم به طور کامل پشتيبانی می شود.
در صورتی که ساختار جدول ما، دارای ستونهای از نوع TEXT ،VARCHAR و BLOB نباشد، از قالب سطر(Row Format) ثابت MyISAM استفاده می شود. در چنين حالتی هر فيلد دارای طول ثابتی بوده و متعاقب آن طول سطرها هم يکسان می باشد. اين بدين معنی است که با حذف یک سطر، می توان سطر ديگری با همان طول را جايگزين آن کرد و بدين ترتيب سطرها ديگر تکه تکه(Fragment) نمی شوند. در ضمن، موتور ذخيره سازی برای دسترسی به يک سطر، از شماره سطر استفاده می کند؛ که اين باعث کوچکتر شدن شاخصها شده و کارايی کل سيستم را بهبود بخشيده و به طور موثرتری از حافظه استفاده می کند. البته شماره سطری که من ذکر کردم، کاملا يه چيز داخلی هست، چون همانطور که می دانيد در جداول بانک اطلاعاتی رابطه ای، سطرها ترتيب خاصی ندارند.
حال اگر هنگام تعريف جدول از ستونهای با نوع TEXT، VARCHAR و BLOB استفاده شود، از قالب سطر پويای MyISAM استفاده می شود. در واقع، اين مورد تنها روی ستونهای از نوع VARCHAR اعمال می شود، آن هم در صورتيکه حداکثر مقدار طول را بزرگتر از ۳ انتخاب کنيم.(VARCHAR(x); x>3) در اين قالب ذخيره سازی، سطرها فضاهای مختلفی اشغال می کنند. فضاهای آزادی که با پاک کردن سطرها یا بروز کردن آنها حاصل می شود، قابل استفاده مجدد است. با اينکه اين قالب از نظر مقدار فضای ذخيره سازی بسيار کارآمد است، تکه تکه شدن سطرها ممکن است رخ دهد که با گذشت زمان باعث کاهش پرفورمنس و کارآيی بانک می شود؛ که همونطور که گفتيم با استفاده از دستور OPTIMIZE TABLE هر چند وقت يکبار، عملی مشابه Defragmentation ای که تو ويندوز انجام می دهيم، روی سطرهای جدول هم اعمال می شود. داده های از نوع TEXT و BLOB جدا از ساير داده های سطر ذخيره می شود، بنابراين برای بروز رسانی ساير داده ها، سرویس دهنده بانک اطلاعاتی لازم نیست بین داده های غالبا حجیم این ستونها حرکت کند.
قالب سطر فشرده MyISAM فقط خواندنی است که با بهره گیری از ابزار myisampack می توان هر جدول معمولی را تا ۷۵ درصد فشرده کرد. در اين روش داده های سطر به طور مستقيم قابل دسترسی است و هر رديف به طور منحصر به فرد با الگوريتمهای فشرده سازی خاص هر نوع ستون(Column Type)، فشرده می شود. برای بایگانی کردن اسناد فروش، لاگها و هر داده ای که به صورت دوره ای جمع آوری می شود، این شیوه ذخیره سازی مناسب است. در ضمن اين روش برای داده های فقط خواندنی که از يک منبع خارجی وارد سيستم می شوند هم کارآمد است. سطرهای جدول فشرده شده را می توان روی سی دی يا هر رسانه ذخيره سازی فقط خواندنی، ذخيره کرده و به همين صورت توسط سرويس دهنده MySQL از آنها استفاده کرد.
در حال حاضر، موتور ذخیره سازی MyISAM از سه نوع روش شاخص گذاری استفاده می کند که این روشها RTREE ،BTREE و FULLTEXT می باشد. معمولا از شاخصهای BTREE استفاده می شود. شاخصهای RTREE هم مخصوص شاخص گذاری داده های جغرافیایی(GIS) است. شاخصهای FULLTEX هم برای پیاده سازی سیستم جستجوی Full Text لحاظ شده اند.(این سیستم جستجو اجازه جستجوی منطقی را فراهم می کند.)
در مطلب بعدی در مورد مکانيزم قفل گذاری، نحوه پشتيبان گيری و جدول MyISAM MERGE صحبت می کنم.
 
نظرات شما(8)  
| صفحه قبل
 
 
نام: نيما شايافر
متولد: 7/7/1362
تحصيلات: دانشجو
شغل: طراح وب و برنامه نويس
وضعيت: آفلاين

ماهيانه
مرداد 86 (2)
خرداد 86 (1)
دي 84 (4)
آذر 84 (5)
مرداد 84 (1)
تير 84 (1)
ارديبهشت 84 (2)
دي 83 (1)
آذر 83 (2)
آبان 83 (2)
مهر 83 (4)
شهريور 83 (6)
مرداد 83 (3)
تير 83 (7)
خرداد 83 (7)
ارديبهشت 83 (8)
فروردين 83 (13)
اسفند 82 (12)

موضوعي






جستجوي پيشرفته

BlogRolling is currently inaccessible.
©2004, Design & Developed by: Nima Shayafar. All rights reserved.