استفاده از cache برای سرعت بخشیدن به کد شما
معمولا در محیط های وب، هنگامی که شما از سایتی بازدید می کنید، یک محتوای مشابه بارها و بارها به شما نمایش داده می شود. caching می تواند تمام یا مقداری از اطلاعات شما را در یک فایل ذخیره کند و به هنگام نیاز آن را برگرداند.
راه های متفاوتی برای این کار وجود دارد، اما در این آموزش تنها با توابع سروکار داریم.
استفاده از profiler
هنگام استفاده از توابع کش شده، باید اطمینان حاصل کنید که تابع کش شده واقعا سریع تر از تابع بدون کش می باشد. برای تست کردن این موضوع، می توانیم از کلاس JProfiler استفاده کنیم.
مثال (آموزش caching در جوملا)
<?php // profilerایجاد شیء $profiler = new JProfiler(); // Do some stuff. echo $profiler->mark( ' seconds to do stuff' ); ?>
کد بالا چیزی شبیه زیر را به ما خواهد داد:
مثال (آموزش caching در جوملا)
0.001 seconds to do stuff
اگر همین کد را بارها و بارها اجرا کنید، مقدار بسیار کمی اختلاف را مشاهده خواهید کرد. این احتمالا به این خاطر است که پروسه های دیگری نیز در سیستم شما در حال اجرا هستند.
تابع مورد نظر برای تست
ما یک تابع را ایجاد خواهیم کرد که به طور واقعی کاری را انجام نمی دهد، اما به ما این امکان را می دهد که محاسبه کنیم چقدر زمان می برد که یک تابع اجرا شود.پس ابتدا فایل کامپوننت را ایجاد کنید:
مثال (آموزش caching در جوملا)
/components/com_testcache/testcache.php
درون این فایل ما یک کلاس به همراه یک متد ایجاد می کنیم:
مثال (آموزش caching در جوملا)
<?php // No direct access. defined( '_JEXEC' ) or die( 'Restricted access' ); class TestClass { function testMethod() { // Get a reference to the global database object. $db = & JFactory::getDBO(); // Execute the same database query 250 times. for ($i=0; $i<250; $i++) { $db->setQuery( 'SELECT * FROM #__content' ); $rows = $db->loadObjectList(); } return $rows; } } // Run the test. $rows = TestClass::testMethod(); ?>
در کد بالا ما 250 بار دیتابیس را فراخوانی می کنیم بنابراین اجرای تابع بسیار کند خواهد شد. در این صورت ما یک تفاوت بزرگ در استفاده از cache را مشاهده خواهیم نمود.
شیء cache
ابتدا مطمئن شوید که در تنظیمات کلی جوملای خودتان، cache را فعال کرده اید.
ما، با استفاده از کلاس JFactory یک ارجاع به cache را به دست می آوریم:
مثال (آموزش caching در جوملا)
<?php $cache = & JFactory::getCache(); ?>
اگر که می خواهید کامپوننت شما از caching استفاده کند، حتی اگر که در تنظیمات کلی(Global Configuration) این گزینه غیرفعال باشد، خودتان می توانید آن را ست کنید:
مثال (آموزش caching در جوملا)
<?php $cache->setCaching( 1 ); ?>
در ادامه، متد خودمان را فراخوانی می کنیم:
مثال (آموزش caching در جوملا)
<?php $rows = $cache->call( array( 'TestClass', 'testMethod' ) ); ?>
اگر بخواهیم از یک تابع استفاده کنیم که در یک کلاس قرار ندارد، نیازی نداریم که از یک آرایه استفاده کنیم:
مثال (آموزش caching در جوملا)
<?php $rows = $cache->call( 'testFunction' ); ?>
هنگام تست کردن کد مورد نظر، می توانیم از متد پیش رو برای پاک کردن cache استفاده نماییم:
مثال (آموزش caching در جوملا)
<?php $cache->cleanCache(); ?>
این کد باعث می شود که تمام فایل های درون فولدر cache/ حذف شوند.
قرار دادن همه ی کدها در کنار یکدیگر
برای مقایسه ی سرعت، ما اکنون متد آزمایشی را 2 بار تست می کنیم. یک بار به صورت نرمال و یک بار دیگر با استفاده از کش. هر دو فراخوانی را در یک شیء profiler قرار می دهیم تا بتوانیم اختلاف را مشاهده کنیم.
مثال (آموزش caching در جوملا)
<?php class TestClass { function testMethod() { // Get a reference to the global database object. $db = & JFactory::getDBO(); // Execute the same database query 250 times. for( $i=0; $i<250; $i++) { $db->setQuery( 'SELECT * FROM #__content' ); $rows = $db->loadObjectList(); } return $rows; } } // Get a reference to the global cache object. $cache = & JFactory::getCache(); // Run the test without caching. $profiler = new JProfiler(); $rows = TestClass::testMethod(); echo $profiler->mark( ' without caching' ); // Run the test with caching. $profiler = new JProfiler(); $rows = $cache->call( array( 'TestClass', 'testMethod' ) ); echo $profiler->mark( ' with caching' ); ?>
حالا با استفاده از index.php?option=com_testcache کامپوننت مورد نظر را اجرا کنید. برای بار اول، چیزی شبیه زیر را خواهید دید:
مثال (آموزش caching در جوملا)
2.093 without caching 2.160 with caching
دفعه ی دوم کمی کند تر خواهد بود، زیرا داده ی برگردانده شده نیاز دارد تا در یک فایل نوشته شود. حالا دوباره صفحه را در مرورگر خود بارگذاری کنید:
مثال (آموزش caching در جوملا)
2.073 without caching 0.008 with caching
صفحه ی مورد نظر را چندین بار لود کنید. خواهید دید که تغییرات کوچکی در اعداد پدید خواهد آمد.
استفاده از آرگومان ها
در مثال ما، تابع مورد نظر، بارها و بارها یک داده ی مشابه را برمی گرداند اما شما اغلب توابعی را می نویسید که تعدادی آرگومان را می پذیرند، و داده های مختلفی را ایجاد می کنند. در اینجا ما مثالمان را با یک جدول متغیر، توسعه می دهیم:
مثال (آموزش caching در جوملا)
<?php class TestClass { function testMethod( $table ) { // Get a reference to the global database object. $db = & JFactory::getDBO(); // Execute the same database query 250 times. for( $i=0; $i<250; $i++) { $db->setQuery( "SELECT * FROM #__$table" ); $rows = $db->loadObjectList(); } return $rows; } } // Determine which database table to query. $table = JRequest::getVar( 'table', 'content' ); // Get a reference to the global cache object. $cache = & JFactory::getCache(); // Run the test without caching. $profiler = new JProfiler(); $rows = TestClass::testMethod( $table ); echo $profiler->mark( ' without caching' ); // Run the test with caching. $profiler = new JProfiler(); $rows = $cache->call( array( 'TestClass', 'testMethod' ), $table ); echo $profiler->mark( ' with caching' ); ?>
سعی کنید تا صفحه را با نام جدول های مختلف بارگذاری کنید:
مثال (آموزش caching در جوملا)
index.php?option=com_testcache&table=content index.php?option=com_testcache&table=users index.php?option=com_testcache&table=menu
شما مشاهده خواهید کرد که اگر، یک صفحه برای اولین بار لود شود، متد کش شده یک مقدار کند تر اجرا می شود اما هنگام بارگذاری مجدد، متد کش شده سریع تر خواهد بود.