سلام .
در پروژه ی mvc ای که مرحله به مرحله با آموزش شما نوشتم ، وقتی در url کنترلر و اکشن مورد نظر رو وارد میکنم ، با کمی تاخیر اکشن مورد نظر رو اجرا میکنه .
میخواستم بدونم چطور میتونم دقیقا بفهمم کدوم خط از کد ، سرعت اجرای برنامه رو کاهش داده ؟
ابزار خاصی داره ؟
الان که برنامه رو گسترش دادم این تاخیر بیشتر هم شده .
-----------------------
آیا در پروژه ای که شما نوشتید هم به این شکل هست ؟
-------------------------
برنامه روی لوکال هست
----------------------------
با تشکر
راستش من مشکل خاصی ندیدم ولی در کل با برنامه هایی مثل 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 میتونید ببینید کجاها داره زمان زیادی میبره و کجاها داره حافظه زیادی مصرف میکنه.
بررسی که کردم متوجه شدم در کنترلرهایی که مدل رو صدا زدم سرعت کم شده .
من در 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
مشکل نباید از PDO باشه. شاید بدلیل عدم استفاده از namespace ها و قوانین PSR باشه. توی پکیج پیشرفته توضیح دادم که چطور ازش استفاده کنید ولی در کل بهتره قوانین PSR رو از سایت php.net مطالعه و توی پروژه اعمال کنید.
تشکر استاد . چشم مطالعه میکنم .
ولی در کل هرجا این 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 هست .
خوب بهتره شما یک شئ برای اتصال توی کلاس بگذارین و وقتی یه بار وصل شدین، اتصال رو داخلش ذخیره کنید و در دفعات بعد چک کنید اگه null نبود فقط اتصال رو وصل کنید. این الان هربار سعی میکنه به دیتابیس وصل بشه.
ممنونم . منظورتون چنین کدی هست ؟
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 ....
}
}
بله تقریباً یه چنین کدی. الان سرعت بهتر نشده؟
ممنونم . در حد 2 ثانیه بهتر شد :) .
چون در لوکال هست این تاخیر کم هم نباید باشه که باید موارد دیگه رو هم چک کنم