PDA

View Full Version : حرفه ای: سیستم کش در php



yakouza
پنج شنبه 18 فروردین 1390, 00:02 صبح
سلام .
کسی در مورد سیستم کش تو php میتونه کمک کنه.
میخام یه سیستم کش طراحی کنم ولی هرجی سرچ میکنم کش تو .net بالا میاد.
کسی مقاله ای سایتی چیزی داره؟ :متفکر:

maysam.m
پنج شنبه 18 فروردین 1390, 16:44 عصر
سلام

این رو ببین:

http://forum.majidonline.com/showthread.php?t=142012

yakouza
پنج شنبه 18 فروردین 1390, 21:27 عصر
این سیستم خوبه ولی تنها ایرادی که داره اینه که مقادیر داینامیک که مدام باید تقییر کنن و نمیشه کش کرد.
دوستان راه حلی دیگه ای دارن؟

ahmad.khaliq
جمعه 19 فروردین 1390, 02:22 صبح
سلام
من یک کلاس کش نوشتم که برات میزارم. امیدوارم به دردت بخوره.


<?php
##########################
# 20/10/2009
# By : Ahmad Khaliq
# Ahmad.khaliq@yahoo.com
# www.ProPage.ir
# lotfan har zaman ke az in script
# estefade kardid, in qesmat ra hazfn nakonid
# propage.ir : php|mysql|ajax|host|domain
#########################

class Cache
{
private $_Cache_Path = '';
private $_cache_life_time = '1800';
private $_cache_file_open = 0;
private $_real_cache_file = '';
private $_temp_cache_file = '';

public function Set_LifeTime($Seconds)
{
$this->_cache_life_time = $Seconds;
}

private function Encrypt($input)
{
return md5($input);
}


public function Set_Path($path='')
{

if(empty($path) or substr($path,(strlen($path)-1),1)=='/')
$this->_Cache_Path = $path;
else
$this->_Cache_Path = $path.'/';
}
public function Start($Name)
{
if(isset($Name))
{
$currentFile = $_SERVER['REQUEST_URI'];
$parts = explode('/', $currentFile);
$currentFile = $parts[count($parts) - 1];
}
else
{
$currentFile = $Name;
}
$this->_real_cache_file = $this->_Cache_Path.$this->Encrypt($currentFile);

if(file_exists($this->_real_cache_file) and abs(filemtime($this->_real_cache_file)-time())<$this->_cache_life_time)
{
include($this->_real_cache_file);
exit();
}
else
{
$this->_temp_cache_file = $this->_real_cache_file.'.'.getmypid();
$this->_cache_file_open = fopen($this->_temp_cache_file,"w");
ob_start();
}
}

public function End()
{
if($this->_cache_file_open)
{
fwrite($this->_cache_file_open,ob_get_contents());
fclose($this->_cache_file_open);
if(file_exists($this->_real_cache_file))
unlink($this->_real_cache_file);
rename($this->_temp_cache_file,$this->_real_cache_file);
ob_end_clean();
}
}
}



برای استفاده از کلاس باید به روش زیر عمل کنید:




$Cache= new Cache;
$Cache->Set_LifeTime(600); // check cache every 10 minutes
$Cache->Set_Path('temp/Cache') // the adress of directory to save the temp files
$Cache->Start(); // Cache starts!

.
. // your page contents
.

$Cache->End();






توضیحات توابع:
تابع: Set_LifeTime
به کمک این تابع برای کلاس تعریف میکنید که کش تا چه زمانی اعتبار داره! در مثال بالا زمان اعتبار روی 10 دقیقه تنظیم شده! یعنی بعد از 10 دقیقه فایل های کش از بین میره و صفحه دوباره کش میشه. شما میتونید بر اساس نیازتون این زمان رو تغییر بدید (از یک دقیقه تا چند ساعت! )

تابع: Set_Path
به کمک این تابع، محل ذخیره سازی فایل های کش رو برای کلاس تعریف میکنید. دقت کنید که دایرکتوری که معرفی میکنید حتما وجود داشته باشد

تابع: Start
این تابع، کش را آغاز میکنید، از این خط به بعد، همه محتویات صفحه کش میشه.


تابع: End
پایان کش!


امیدوارم این کلاس به درد بخوره. لطفا اگه جایی از این کد استفاده کردی، اسم منو از بالای کلاس حذف نکن.
ممنون

Cyletech
جمعه 19 فروردین 1390, 11:48 صبح
این کش چیه و چیکار می کنه و به چه درد می خوره دوستان؟

yakouza
جمعه 19 فروردین 1390, 22:40 عصر
از سیستم کش واسه این استفاده میکنن که کویری هایی که باید تو هر بار درخواست صفحه اجرا بشن فقط و فقط یه بار اجرا میشن که نتیجه کویری یه جا به صورت html ذخیره میشه و تو درخواست های بعدی فقط فایل ذخیره شده فراخانی میشه که باعث افزایش سرعت بارگذاری میشه.

Cyletech
شنبه 20 فروردین 1390, 13:39 عصر
متوجه شدم برای چی استفاده می کنن ازش ولی الان این برام مبهمه که من کجا و چه وقت باید ازش استفاده کنم؟ مثلاً چقدر باید از یک کوئری استفاده بشه که باید از این سیستم استفاده کنیم؟

yakouza
شنبه 20 فروردین 1390, 19:47 عصر
مثلاً چقدر باید از یک کوئری استفاده بشه که باید از این سیستم استفاده کنیم؟
یعنی چی؟
فقط برای افزایش سرعت همین.

Cyletech
یک شنبه 21 فروردین 1390, 20:13 عصر
فقط برای افزایش سرعت همین. خب سوال من اینجاست که در صورت باید از سیستم کش استفاده بشه؟ همیشه و همه جا که نباید استفاده کنیم ازش ( افراط و تفریط نباید صورت بگیره. بالاخره این امر هم خطر های خودش رو داره. نداره؟)

phpweb
یک شنبه 21 فروردین 1390, 20:54 عصر
خب سوال من اینجاست که در صورت باید از سیستم کش استفاده بشه؟ همیشه و همه جا که نباید استفاده کنیم ازش ( افراط و تفریط نباید صورت بگیره. بالاخره این امر هم خطر های خودش رو داره. نداره؟)

ببینید توی پنلهای سمت چپ و راست صفحه ممکنه بخواید مقالات تصادفی، آخرین مقالات ثبت شده، مقالات پر بازدید و خیلی چیزای دیگه که باید در هر صفحه از دیتابیس خونده بشن رو نمایش بدید.

در این مورد استفاده از کش فکر کنم موثر باشه. البته با توجه به حجم کم اطلاعات خونده شده در این حالت دوستانی که تجربه بیشتری دارن باید نظر بدن.

phpweb
یک شنبه 21 فروردین 1390, 20:55 عصر
سلام
من یک کلاس کش نوشتم که برات میزارم. امیدوارم به دردت بخوره.


<?php
##########################
# 20/10/2009
# By : Ahmad Khaliq
# Ahmad.khaliq@yahoo.com
#########################

class Cache
{
private $_Cache_Path = '';
private $_cache_life_time = '1800';
private $_cache_file_open = 0;
private $_real_cache_file = '';
private $_temp_cache_file = '';

public function Set_LifeTime($Seconds)
{
$this->_cache_life_time = $Seconds;
}

private function Encrypt($input)
{
return md5($input);
}


public function Set_Path($path='')
{

if(empty($path) or substr($path,(strlen($path)-1),1)=='/')
$this->_Cache_Path = $path;
else
$this->_Cache_Path = $path.'/';
}
public function Start($Name)
{
if(isset($Name))
{
$currentFile = $_SERVER['REQUEST_URI'];
$parts = explode('/', $currentFile);
$currentFile = $parts[count($parts) - 1];
}
else
{
$currentFile = $Name;
}
$this->_real_cache_file = $this->_Cache_Path.$this->Encrypt($currentFile);

if(file_exists($this->_real_cache_file) and abs(filemtime($this->_real_cache_file)-time())<$this->_cache_life_time)
{
include($this->_real_cache_file);
exit();
}
else
{
$this->_temp_cache_file = $this->_real_cache_file.'.'.getmypid();
$this->_cache_file_open = fopen($this->_temp_cache_file,"w");
ob_start();
}
}

public function End()
{
if($this->_cache_file_open)
{
fwrite($this->_cache_file_open,ob_get_contents());
fclose($this->_cache_file_open);
if(file_exists($this->_real_cache_file))
unlink($this->_real_cache_file);
rename($this->_temp_cache_file,$this->_real_cache_file);
ob_end_clean();
}
}
}



برای استفاده از کلاس باید به روش زیر عمل کنید:




$Chash= new Cashe;
$Chash->Set_LifeTime(600); // check cache every 10 minutes
$Chash->Set_Path('temp/chache') // the adress of directory to save the temp files
$Chash->Start(); // chache starts!

.
. // your page contents
.

$Chash->End();






توضیحات توابع:
تابع: Set_LifeTime
به کمک این تابع برای کلاس تعریف میکنید که کش تا چه زمانی اعتبار داره! در مثال بالا زمان اعتبار روی 10 دقیقه تنظیم شده! یعنی بعد از 10 دقیقه فایل های کش از بین میره و صفحه دوباره کش میشه. شما میتونید بر اساس نیازتون این زمان رو تغییر بدید (از یک دقیقه تا چند ساعت! )

تابع: Set_Path
به کمک این تابع، محل ذخیره سازی فایل های کش رو برای کلاس تعریف میکنید. دقت کنید که دایرکتوری که معرفی میکنید حتما وجود داشته باشد

تابع: Start
این تابع، کش را آغاز میکنید، از این خط به بعد، همه محتویات صفحه کش میشه.


تابع: End
پایان کش!


امیدوارم این کلاس به درد بخوره. لطفا اگه جایی از این کد استفاده کردی، اسم منو از بالای کلاس حذف نکن.
ممنون


می شه بگید در چه مواردی باید از کش استفاده کنیم؟

maysam.m
دوشنبه 22 فروردین 1390, 12:31 عصر
می شه بگید در چه مواردی باید از کش استفاده کنیم؟

سلام

ببینید زمانی از کش باید استفاده کرد که تعداد بازدیدکنندگان سایت بالا می رود و استفاده از منابع سرور افزایش پیدا میکند.

فرض کنید برای مشاهده صفحه اول سایت برای هر کاربر احتیاج به ارسال 10 کوئری داریم. و سایت هم هر 1 روز به روز می شود. وقتی ما 100 نفر کاربر آنلاین داشته باشیم و برای هر کاربر 10 کوئری یعنی 1000 کوئری و فشار به سرور و استفاده از منابع سرور و با افزایش کاربرها ممکنه سرور از دسترس خارج بشود.

خوب اینجا ما با کش کردن صفحه اصلی احتیاجی نیست 1000 کوئری بفرستیم و به راحتی محتوای فایل کش مون رو فراخوانی میکنیم و سرعت دسترسی رو بالا می بریم و هم استفاده از منابع سرور را به طور چشمگیری کاهش میدیم و میتونیم به تعداد کاربر بیشتری خدمات بدهیم.

سیستم کش بیشتر در سایتهای بزرگ استفاده می شود و در سایتهای کوچک به دلیل تعداد کم بازدیدکنندگان لزومی ندارد.

این نظر من بود و باید نظر سایر دوستان را هم شنید ;)

ahmad.khaliq
دوشنبه 22 فروردین 1390, 22:47 عصر
توضیحی که دوست عزیزمون maysam.m دادند کامل و مفید بود.

ببینید دوست عزیز، وقتی که سایت بزرگی داشته باشید، و بازدید سایت زیاد باشه (منظور از زیاد یعنی بالای هزار نفر) وقتی بازدیدکننده به سایت شما مراجعه میکنه، سرور شما باید دائما یک عملیات پردازش تکراری رو انجام بده، مثلا (دریافت لیست آخرین مقالات، دریافت لیست آخرین کاربران ثبت نام شده، دریافت لیست آخرین اخبار و ....)
در این حالت وقتی شما از کش استفاده میکنید، سرور یک بار همه پردازشهای بالا رو انجام میده و نتیجه اون رو در فایل کش ذخیره میکنه، و از اون به بعد، فقط نتیجه ی پردازش ها رو از روی فایل میخونه و به کاربر نشون میده. وقتی که زمان انقضای فایل کش به پایان رسید، سرور دوباره محتویات صفحه رو کش میکنه و ذخیره میکنه.

مثال:
فرض کنید شما روزانه، صدهزار نفر بازدید کننده دارید!

بدون سیستم کش: به ازای هر بازدید کننده یک بار پردازش صورت میگیره
نتیجه: صد هزار بار پردازش در یک روز

با سیستم کش: اگر هر یک ساعت صفحه کش بشود
نتیجه: فقط 24 بار پردازش در یک روز!!!!

yakouza
دوشنبه 22 فروردین 1390, 23:20 عصر
وقتی که زمان انقضای فایل کش به پایان رسید، سرور دوباره محتویات صفحه رو کش میکنه و ذخیره میکنه.

خب تا اون موقع ممکنه که مثلا 1000 تا بازدید داشته باشیم که در اون صورت ثبت نمیشه اینو چیکار کنیم؟
تو کلاس کش گذاشته شده هم به همین صورته.

ahmad.khaliq
سه شنبه 23 فروردین 1390, 13:20 عصر
خب تا اون موقع ممکنه که مثلا 1000 تا بازدید داشته باشیم که در اون صورت ثبت نمیشه اینو چیکار کنیم؟
تو کلاس کش گذاشته شده هم به همین صورته.

توابعی که عملیات شمارش بازدید های صفحه رو انجام میدن رو باید قبل از شروع کش فراخوانی کنید. در این حالت بازدید ها به درستی شمارش میشن و بقیه صفحه هم کش میشه.

tem988
سه شنبه 23 فروردین 1390, 16:46 عصر
سلام
من از این کش استفاده کردم ولی میخوام زمانی که یک پست جدید ارسال میکنم کش حذف بشه و دوباره ساخته بشه میتونید کمک کنید ممنون میشم

ahmad.khaliq
چهارشنبه 24 فروردین 1390, 01:51 صبح
سلام
من از این کش استفاده کردم ولی میخوام زمانی که یک پست جدید ارسال میکنم کش حذف بشه و دوباره ساخته بشه میتونید کمک کنید ممنون میشم

سلام
هر بار که پست جدید ایجاد میکنید، محتویات دایرکتوری کش رو تخلیه کنید. در این حالت زمانی که فایل های موجود در دایکتوری کش موجود نباشند، سیستم شروع به انجام عملیات کش میکند، حتی اگر زمان انقضا سر نرسیده باشد!!!