رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
تست سرعت برنامه ی MVC
#1
سلام .
در پروژه ی mvc ای  که مرحله به مرحله با آموزش شما نوشتم ، وقتی در url کنترلر و اکشن مورد نظر رو وارد میکنم ، با کمی تاخیر اکشن مورد نظر رو اجرا میکنه .
میخواستم بدونم چطور میتونم دقیقا بفهمم کدوم خط از کد ، سرعت اجرای برنامه رو کاهش داده ؟
ابزار خاصی داره ؟
الان که برنامه رو گسترش دادم این تاخیر بیشتر هم شده .
-----------------------
آیا در پروژه ای که شما نوشتید هم به این شکل هست ؟
-------------------------
برنامه روی لوکال هست
----------------------------
با تشکر
پاسخ
تشکر شده توسط:
#2
راستش من مشکل خاصی ندیدم ولی در کل با برنامه هایی مثل AB و Siege میتونید بنچمارک بگیرین ولی این موضوع کلیه و نمیشه فهمید مشکل کجای برنامه است. برای اینکه بدونید کجاها داره سرعت رو کم میکنه، میتونید توی خود کدهاتون با کمک فایلهای لاگ کارها رو مدیریت کنید. مثلاً یه چنین کلاسی درست کنید:
class Log
{
    public static $path = dirname(__FILE__) . '/logs/';
    
    public static currentTime($file, $line)
    {
        if($fp = fopen(self::$path . 'time.log', 'a')) {
            fwrite($fp, microtime(true) . ' - ' . $file . ' - ' . $line);
            fclose($fp);
        }
    }
    
    public static currentMemory($file, $line)
    {
        if($fp = fopen(self::$path . 'memory.log', 'a')) {
            fwrite($fp, memory_get_usage(true) . ' - ' . $file . ' - ' . $line);
            fclose($fp);
        }
    }
}

حالا هرجا خواستین ببینین یک دسته از دستورات، چقدر حافظه مصرف میکنن و چه زمانی صدا زده میشن، میتونید به این شکل این متدها رو صدا بزنید:
Log::currentTime(__FILE__, __LINE__);
Log::currentMemory(__FILE__, __LINE__);
و با بررسی فایلهای time.log و memory.log میتونید ببینید کجاها داره زمان زیادی میبره و کجاها داره حافظه زیادی مصرف میکنه.
پاسخ
تشکر شده توسط: mary , sorkhabi
#3
بررسی که کردم متوجه شدم در کنترلرهایی که  مدل رو صدا زدم سرعت کم شده .

من در  libraries یک کلاس crud نوشتم  که از PDO مشتق شده:

class crud extends PDO

و مدلهای دیگه از crud مشتق میشن .

مثلا :

class Category extends crud

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


class CategoryController extends Controller{

private $db;
public function __construct(){
$this->db = new category();
}


-----------------------
آیا استفاده از  PDO باعث کاهش سرعت میشه ؟
-------------------------

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

مثلا در کنترلر comment و متد index
پاسخ
تشکر شده توسط:
#4
مشکل نباید از PDO باشه. شاید بدلیل عدم استفاده از namespace ها و قوانین PSR باشه. توی پکیج پیشرفته توضیح دادم که چطور ازش استفاده کنید ولی در کل بهتره قوانین PSR رو از سایت php.net مطالعه و توی پروژه اعمال کنید.
پاسخ
تشکر شده توسط: mary
#5
تشکر استاد . چشم مطالعه میکنم .
ولی در کل هرجا این connect رو صدا زدم  ($this->connect() )سرعت پایین اومده :


class crud extends PDO{
    
	protected $table_name=''; 
	public $_rules = array();      
    private   $result;    
     
    public function __construct(){}  
	
    public function Connect(){
	
		$config = Loader::load('Configs');
        $dns = $config->dbEngine.':dbname='.$config->dbName.";host=".$config->dbHost;
		$options = array(
			PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'',
		);
		try{
       		 parent::__construct( $dns, $config->dbUser,$config->dbPass,$options);
		}
		catch(Exception $e){
			echo 'cannot connect db'.$e->getMessage();
		}
		
	}

--------------------
قبلا تو construct نوشته بودم که به محض ایجاد شی از crud سرعت پایین می اومد .
فهمیدم به خاطر کد connection هست .
پاسخ
تشکر شده توسط:
#6
خوب بهتره شما یک شئ برای اتصال توی کلاس بگذارین و وقتی یه بار وصل شدین، اتصال رو داخلش ذخیره کنید و در دفعات بعد چک کنید اگه null نبود فقط اتصال رو وصل کنید. این الان هربار سعی میکنه به دیتابیس وصل بشه.
پاسخ
تشکر شده توسط: sorkhabi , mary
#7
ممنونم . منظورتون چنین کدی هست ؟

class crud{
 
	public static $pdo = NULL;
 
	public static function db(){
 
		$dsn = 'mysql:dbname=learning;host=localhost';
		$options = array(
		PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'',
		);
		 
		if(self::$pdo == NULL){
		self::$pdo = new PDO($dsn,'root','',$options);
		}
	 
	}
	 
	public static function select(){
		 
		self::db();
		$result = self::$pdo->query("select * from `students`");
		//code ....
	}
}

پاسخ
تشکر شده توسط:
#8
بله تقریباً یه چنین کدی. الان سرعت بهتر نشده؟
پاسخ
تشکر شده توسط: mary
#9
ممنونم . در حد 2 ثانیه بهتر شد :) .

چون در لوکال هست این تاخیر کم هم نباید باشه که باید موارد دیگه رو هم چک کنم
پاسخ
تشکر شده توسط:




کاربران در حال بازدید این موضوع: 1 مهمان