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


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

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

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

ם تعداد بازديدكنندگان
كل: 924725
ديروز: 915
امروز: 775
ם تعداد كاربران آنلاين
5 نفر
ם پنج مراجعه آخر
znas5eea.strefa.pl
znas5eea.strefa.pl
znas5eea.strefa.pl
liyxdrzko.is.com
djdgjkfbf.chez.com
 
 
Tick Functionها (چطور PHP تیک می زند؟!!)
Tick Functions اينطور که از شواهد امر پيداست، يک ماهی از بروزرسانی اينجا ميگذره ولی خوشبختانه هيت سايت طبق معمول هميشه بوده و انشاا... بهتر خواهد شد. مقالات XML و PHP 5 هنوز تموم نشده و در آينده نچندان دور روی سايت قرار می گيره؛ پس منتظر مقالات تکميلی باشيد ولی امروز ميخوام در مورد يکی ديگه از اسرار غريب و عميق PHP صحبت کنم. درسته که PHP از Multi Threading پشتيبانی نمی کنه ولی يه چيزايی تو همين مايه ها رو در داخل خودش مدفون کرده و نمی خواهد تا کسی از اين رازها اطلاع کسب کنه. من اينجا صرفا يک معرفی اجمالی ميکنم و بقيه اش زحمت خود شما. wink
همانطور که يک انسان خردمند گفته: «The truth shall set you free» ما هم نگاهی گذرا به ابزار ناشناخته ای که در اختيار توسعه دهندگان PHP قرار گرفته خواهيم انداخت تا حقیقت باعث رهایی ما بشه!
اگرچه PHP فاقد یک Threading API واقعی است، اما یک چیز جنبی دارد: یک سیستم نادخ برای اجرای توابع از پیش تعریف شده در فواصل زمانی معین که به توابع Tick معروفند. موتور PHP مکانیزمی جهت تولید تیک ها بعد از تعداد معینی دستورات سطح پایین دارد. با این وجود می توان توابعی را Register کرده تا هر زمان که PHP یکی از این تیکها را تولید کند، اجرا شوند. بدین صورت اجرای اسکریپت به طور اتوماتیک متوقف شده تا دستورات دیگر اجرا شوند.
اینکه چگونه تابعی را Register یا Unregister کنیم و یا ساختار declare چیست بحث مفصلی است که علاقه مندان می توانند خود به دنبال آن باشند. البته شايد در آينده در اين مورد توضيحات مفصلی بدهم اما با توجه به زمان و گرفتاريهای شخصی فعلا به ذکر يک Real Word Solutionای که با بهره گيری از Tick Functionها حاصل می شود می پردازم.
تفاوت بارز توابع Tick با ساير بخشهای PHP در اين است که اين توابع تنها ميانبرهای جهت مسائل از قبل حل شده نيستند، بلکه پاسخی به مسائل حل نشدنی پيشين هستند. برای مثال تابع ()print_r تابع جالبی است، اما بدون آن هم می شود با انجام کارهای اضافی تر، خروجی را فرمت بندی کرد. از طرف دیگر توابع Tick، قادر به انجام کارهايی هستند که تابع يا توسعه های دیگر از انجام آن ناتوان اند.
Auto-Saving
اسکريپت های زيادی هستند که زمان اجرايی آنها طولانی است. وقتی چنين اسکريپتهايی را اجرا می کنيد، امکان متوقف کردن يا از سرگيری اجرای آن يک بايد است؛ بخصوص در فاز اشکالزدايی اسکريپت. توابع Tick روش ساده ای جهت ذخيره سازی خودکار وضعيت اسکريپت را ارائه می کند که بدين ترتيب می توان اجرای اسکريپت را دوباره از سر گرفت. برای مثال، يک اسکريپت Spider را در نظر بگيريد که با تفسير صفحات وب از يک سايت، آنها را به بانک اطلاعاتی خود اضافه می کند. (نظیر عملی که موتورهای جستجو انجام می دهند) اجرای اسکريپت وابسته به يک صف می باشد. هر زمانی که صفحه وب جديدی تشخيص داده شود، URL آن به انتهای صف افزوده می شود. با پيمايش صف، اسکريپت قادر به بررسی تمام صفحات موردنياز جهت تفسير است بدون اينکه نيازی به Recursion يا عمل بازگشتی باشد. بررسی يک سايت بزرگ ممکن است چندين ساعت به طول بيانجامد. متاسفانه اگر باگ يا اشکالی در اسکريپت ما حادث شود يا يه دلايلی نياز به متوقف کردن اسکريپت داشتيم، می بايست دوباره از ابتدا شروع کنيم. :(
خوب با در نظر گرفتن اين سناريو، چاره ای که می انديشيم استفاده از توابع Tick برای ذخيره سازی صف در فواصل زمانی معين(مثلا چند ثانیه یکبار) است. cool تکه کد پايين چارچوبی را جهت پياده سازی چنين سيستمی نشان می دهد.

<?
// autosave filename
define(AUTOSAVE_FILE'obj.dat');

// object definition
class AutoSaveObject
{
    var 
$volatile false;
    var 
$num 0;
}

// save the object to the autosave file
function autosave()
{
    global 
$object;
    if (
$object && !$object->volatile) {
        
$fh fopen(AUTOSAVE_FILE'w');
        
fwrite($fhserialize($object));
        
fclose($fh);
    }
}

// load the object or create a new instance
if (file_exists(AUTOSAVE_FILE)) {
    
$file file_get_contents(AUTOSAVE_FILE);
    
$object unserialize($file);
} else {
    
$object = new AutoSaveObject();
}

// start the autosave tick function
register_tick_function('autosave');
declare(
ticks=1);

// print and increment the object's num field
while (true) {
    print 
$object->num.'.';
    
$object->num++;
    
sleep(1);
}

?>

ابتدا آبجکتی که حاوی اطلاعات وضعيتی اسکريپت است تعريف می شود. در اين مثال از کلاس AutoSaveObject استفاده می کنيم. متغير num$ نشاندهنده داده هايی است که می خواهيم آنها را حفظ کنيم.(مثلا صفی که حاوی URL صفحات است) متغير volatile$ بعنوان فلگی است که معرف عدم ذخيره سازی آبجکت است.مواردی پيش می آيد که ذخيره سازی آبجکت عاقلانه به نظر نمی رسد؛ مثلا در حین محاسبه. ست کردن volatile$ با مقدار True، موجب می شود که تابع ()autosave آبجکت را ذخيره نکند. بعد از کلاس، تابع ()autosave ما را به مقصود خود می رساند. آبجکت ابتدا تبديل به يک رشته کاراکتر با فرمت مشخص می شود(اصطلاحا Serialize می شود) و در يک فايل ذخيره می شود. سپس آبجکت را بارگذاری کرده(اصطلاحا Unserialize می کنیم) يا اگر فايل موردنظر موجود نباشد، آنرا می سازيم. سپس تابع مذکور را بعنوان يک Tick Function رجيستر می کنيم و دستورالعمل تيک را هم تعريف می کنيم.
در مثالی که در بالا ارائه شد بدنه اصلی برنامه ما تنها متغير num$ آبجکت را یکی یکی افزایش می دهد. اگر اسکريپت بالا را اجرا کنيد و سپی آنرا متوقف کنيد و دوباره آنرا اجرا کنيد به قدرت واقعی Tick Functionها پی می بريد، به اين صورت که شمارش از همان نقطه ای که پايان يافته از سر گرفته می شود. با حذف فايلی که آبجکت در آن ذخيره می شود، اسکريپت Reset شده و شمارش از مقدار ابتدايی مجددا آغاز می شود. فرکانسی که طی آن تيک توليد می شود با تنظيم مقدار دستورالعمل tick در ساختار declare تعيين می شود. هر چه اين مقدار کمتر باشد، عمل ذخيره سازی خودکار در فواصل زمانی کمتری انجام شده و در عوض موجب کند شدن اجرای اسکریپت هم می شود.

*) بنده به هيچ وجه نگفتم که Tick Functionها دقیقا ويژگيهای Multi Threading را در PHP پشتيبانی می کنند.
*) کاربردهای ديگری که می توان برای Tick Functionها در نظر گرفت: کنترل پردازش و Profile کردن توابع (در آینده اشاره ای خواهم کرد)، ساخت یک دیباگر با تمام امکانات(با امکاناتی نظیر مشاهده متغیرها، نقاط انفصال و...)، یک سیستم مدیریت رخداد، یک موتور پرس و جوی Multi Thread برای MySQL و یک ناظر فراخوانی تابع و...
*) نکات زيادی پيرامون ساختار declare و توابع register_tick_function و unregister_tick_function وجود دارد که اگر عمری باقی بود به مطالب بعدی موکول ميشود.
*) شما چه کاربردهايی را تصور می کنيد؟ smile
 
نظرات شما(33)  

 
 
نام: نيما شايافر
متولد: 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.