تالار گفتمان nCIS.ir

نسخه‌ی کامل: باگ در فریمورک Yii2
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام.
چرا Yii2 هربار عملیات لاگین رو انجام میده ؟ به ازای هر درخواست ؟
به این کد دقت کنید ( فایل config )
'on beforeAction' => function ($event) {

    session_start();
    echo '<pre>';
    print_r($_SESSION);
    Yii::$app->user->isGuest;
    print_r($_SESSION);
}


اولین print خالی هست اما دومین print نه و آیدی کاربر در __id ذخیره شده.
اگر مجددا رفرش کنید،بازم همینطور هست.اولین print خالی هست اما دومین print نه.
یعنی هربار داره این عملیات رو انجام میده! چرا نباید چک بکنه که اگر session وجود نداشت،این کار انجام بشه؟! خیلی بهتر از این هست هربار انجام بشه!
و اگر شما در فایل ایندکس ( ورودی فریمورک ) خط آخر memory_get_usage رو ببینید،این isGuest حجمی بیش از 500 کیلوبایت در رم داره! چون عملیات لاگین انجام میشه،اینکه کاربر لاگین هست یا نه. با خوندن سورس کد هم متوجه میشید.
یعنی اختلاف بودن و نبودنش بین 500 تا 700 کیلوبایت حافظه مصرف میکنه.
مرگباره این سناریو!
اول اینکه تا وقتی که درمورد هدف یه مکانیزم اطلاعات کافی ندارین، درمورد مرگبار بودن یا اینکه اصلاً باگ هست یا نه، اینقدر با قاطعیت نظر ندین.

دوم اینکه علت این روش اینه که Yii همه‌چیز رو بصورت On Demand بارگذاری میکنه. یعنی تا وقتی که به یک قابلیت نیاز نداشته باشین، نمیره اون رو بخونه و توی حافظه بارگذاری کنه. در این مورد هم همینطوره. Yii از ترکیب کوکی و سشن برای مدیریت لاگین کاربران استفاده میکنه تا وضعیت هر کاربری، فقط درصورت نیاز به Yii::$app->user->isGuest در حافظه بارگذاری بشه و تا قبل از اون با درگیرکردن سشن، حافظه‌ی سرور رو برای این کارها شلوغ نکنه. ضمناً شما باید با Yii::$app->session با سشن کار کنید نه با روش سنتی. وقتی توی فریمورک هستین، دیگه از چهارچوب سنتی بیاین بیرون.

مورد سوم هم اینکه علت مصرف حافظه، فقط چک‌کردن لاگین نیست. کامپوننت User علاوه‌بر مدیریت ورود و خروج کاربران، مدل کاربر جاری رو هم ازطریق Yii::$app->user->identity در اختیار شما میگذاره که این مدل درکنار کامپوننت که کارهای خیلی بیشتری نسبت به ورود و خروج تنها انجام میده، این مقدار حافظه رو مصرف میکنه.

لطفاً قبل از قضاوت، مطالعاتتون رو در مستندات فریمورک و سورس‌کدش افزایش بدین، درغیر اینصورت بجای اینکه از قبل حکم صادر کنین، فلسفه‌ی کار رو اینجا یا توی انجمن رسمی فریمورک Yii بپرسین.