مهدی
4 سال پیش توسط مهدی مطرح شد
10 پاسخ

مشکل عجیب middleware در لاراول

سلام
من پروژه لاراولی خودم رو، روی سرور آپلود و تنظیمات لازم رو انجام دادم و پروژه اوکیه

حالا در فایل web.php من یه Route Group دارم که روی این گروه یک middleware اعمال شده

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

حتی اون میدلور رو، داخل متد construct کنترلر مربوط به اون روت بارگزاری کردم ولی جواب نداد که نداد
در نهایت کش های کل سیستم رو پاک کردم ولی بی نتیجه بود
زیاد سرچ زدم ولی به نتیجه خاصی نرسیدم
تجربه ای دارید؟


ثبت پرسش جدید
محسن مهری
تخصص : برنامه نویس back-end با زبان...
@mohsen.mehri6101 4 سال پیش آپدیت شد
1

سلام لطفا کد بزار
میدلور روت هات و اون تابع یا کنترلر
مطمئنم خطای منطقی داری


مهدی
تخصص : برنامه نویس و طراح وب
@mrmmg 4 سال پیش مطرح شد
0

@mohsen.mehri6101

Route::group(['middleware' => 'tracker'], function (){
    //Cache for 1 week
    Route::group(['middleware' => 'lscache:max-age=604800;public;esi=on', 'lstags:1wcache'], function (){
        Route::get('/experience','HomeController@showExperience');
        Route::get('/contact','ContactController@show')->name('contact');
        Route::get('/donate','PaymentController@show')->name('donate-page');
    });
    //Cache for 1 days
    Route::group(['middleware' => 'lscache:max-age=86400;public;esi=on', 'lstags:1dcache'], function (){
        Route::get('/', 'HomeController@home')->name('root');   😑😑😑
        Route::get('/portfolio','HomeController@showPortfolio');
    });

    //Cache for 12 hrs
    Route::group(['middleware' => 'lscache:max-age=3600;public;esi=on', 'lstags:12hcache'], function (){
        Route::get('/blog','HomeController@blog');
        Route::get('/blog/{post}','HomeController@showPost');
        Route::get('/p/{id}','HomeController@shortLink');
    });
});

کد Middleware:

<?php

namespace App\Http\Middleware;

use App\Jobs\ProcessUserTracker;
use Closure;
use Jenssegers\Agent\Agent;

use Illuminate\Support\Facades\Log;

class UserTracker
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next){

        //get user ip
        $ip = geoip()->getClientIP();
        $userTrack = geoip($ip);
        $agent = new Agent();

        //use jobs to make application faster
        ProcessUserTracker::dispatch($userTrack, $agent);

        return $next($request);
    }
}

من از کش Lscache استفاده کردم ولی مربوط به این مورد نیست، خطی رو که ایموجی گذاشتم نگاه کنید دقیقا به همین Route میدولور اعمال نمیشه اما بقیه Route ها میدلور رو اعمال می کنن و نتیجه تو دیتابیس ثبت میشه.

حتی اون Route (/) رو هم از کل Cache بیرون بردم و LsCache رو غیرفعال و کاملا پاک کردم ولی بازم نتیجه همین بود.

همچنین هیچ ارورلاگی یا خطایی هم برنمیگرده با اینکه App_Debug روی true تنظیمه و App_Env هم روی حالت local تنظیم کردم. (کد های مربوط روی سرور قرار داره و داخل لوکال هاست مشکلی ندارم برای همین تلاش کردم محیط لوکال هاست رو شبیه سازی کنم.)

ممکنه به نصب نبودن برخی از اکستنشن های php مربوط باشه؟


woz
تخصص : fan of open source world
@wozniak 4 سال پیش مطرح شد
1

سلام
پروژتون روی لوکال مشکل داره یا نه؟
این تست ها رو هم انجام بدید نتیجه رو مشاهده کنید

مسیر با اسم root رو همونجا به صورت زیر خروجی بگیرید که ببینید آیا درخواست به این مسیر میرسه یانه.

        Route::get('/', function() {  dd(1);  })->name('root');   😑😑😑

در صورتی که در خواست به اون قسمت نرسید ، خود مسیر و متد رو تغییر بدید مثلا به صورت زیر، که شاید این مسیر جای دیگه ای استفاده شده

        Route::get('/else', function() {  dd(1);  })->name('else_root');   😑😑😑

مهدی
تخصص : برنامه نویس و طراح وب
@mrmmg 4 سال پیش آپدیت شد
0

@behzadd
سلام ممنونم از راهنمایی تون، راه اول رو انجام دادم و این بار middleware اجرا شد. یعنی مشکل از کنترلر هست؟

به روز رسانی (7:50)
همین الان Route قبلی رو از کامنت در اوردم و این بار هم Middleware اجرا شد!! یعنی چیزی کش شده بوده یا به Lscache ربطی داره؟

به روز رسانی (7:55)
بله دقیقا مشکل از Lscache هست چون بقیه Route هام که تا الان بهشون درخواست نداده بودم یکبار middleware رو اجرا می کنن و برای دفعات بعدی خیر! خیلی عجیبه!


woz
تخصص : fan of open source world
@wozniak 4 سال پیش مطرح شد
1

@mrmmg
مشکلتون الان حل شده یا باقیست؟

اگر هنوز هست موارد زیر رو در نظر داشته باشید :
اگر در مورد نحوه تست برای کارکرد middleware مطمئن هستید که درست انجام دادید، موارد زیر رو بررسی کنید.
این بار بررسی کنید آیا درخواست به متدی که دادید تو middleware می رسه یا نه. مانند همین روش قبلی.

در مورد کش مطمئن نیستم. به خصوص که شما clear cache هم انجام دادید ،

~$ php artisan config:clear
~$ php artisan cache:clear

اگر رو سرور تست لوکال هستید ( php built-in server ) که یکبار قط و وصل کردن اون یک سری از bootstraper variables هاشو دوباره میخونه و احتمال داره با توقف و اجرا دوباره سرور لوکال ، فایل web.php تازه سازی بشه.

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

سعی کنید مراحل دیباگ رو یکی یکی پیش برید. اول کش ها رو پاک کنید و تست کنید اگر حل نشد بررسی کنید از همون ابتدا که درخواست به یکی از route های شما میاد به کجا میره.


مهدی
تخصص : برنامه نویس و طراح وب
@mrmmg 4 سال پیش مطرح شد
0

@behzadd
در صورتی که روت ها رو از حالت کش خارج کنم یعنی روی اون ها میدلور مربوط به کش اجرا نشه در این صورت اوکیه و میدلور مربوطه کاملا اجرا میشه و مشکلی نداره

پروژه روی لوکال هاست اصلا این مشکل رو نداره اما روی سرور این مشکل وجود داره و امکان ریست کردن سرور هم وجود نداره.

در مورد اون دو دستور هم که دادید من اون هارو مداوم اجرا کردم ولی نتیجه ای نگرفتم و حتی دستور php artisan optimize:clear رو نیز بارها اجرا کردم ولی نتیجه ای در پی نداشته.

فعلا با پاک کردن کش هایی که Lscache میسازه یکبار middleware اجرا میشه اما برای دفعات بعدی گویا اصلا middleware وارد فاز اجرایی نمیشه من Log هم گرفتم ولی تفاوتی نداشت و مطمئنم وقتی کش اعمال بشه middleware اصلا اجرا نمیشه.

اکستنشن opcache هم اصلا فعال نیست.

من یک issue برای برنامه نویس پکیج ثبت کردم و همین الان پاسخ دادند و میتونید از این لینک پاسخشون رو مشاهده کنید.
طبق توصیه خودشون گویا باید بیخیال این middlware بشم و request خودم رو به صورت ajax بفرستم!!!

شما ایده ای دارید؟


woz
تخصص : fan of open source world
@wozniak 4 سال پیش آپدیت شد
1

@mrmmg
خب من الان مستندات lscache رو خوندم و به جواب رسید :
ظاهرا lscache کارش همینه که روت های شما رو به صورت html آماده serve کنه. و فقط اولین کاربری که اون route رو هیت میکنه در '''سطح لاراول ''' اجرا میشه. حالا دفعات بعد چه اتفاقی می افته؟ وبسرور light speed ( یا هر وبسرور دیگری - اما ظاهرا lscache فقط برای ligh speed هست) شماست که این مسیر رو که lscache کش کرده به صورت html برای یوزر serve میکنه و اون درخواست به لاراول شما نمیرسه و یعنی این بار در ''سطح سیستمی''' پاسخ داده میشه به اون url شما ( وب سرور هست که جواب میده ). بر اساس مستندات lscache ;


When WP dynamically generates the static HTML page, LSCache communicates with LiteSpeed Web Server to store a copy of it. Once the static copy exists in the cache, then that copy can be served to future visitors, eliminating the expensive WordPress PHP process for all but the first visitor to request the page.

When your site is cached, it requires much less involvement from the WordPress backend, which translates into a faster site and a better experience for your site’s visitors.

پس نمیشه کاریش کرد.
حالا شما چرا از این lscache استفاده کردین و هدفتون چی بوده که در موردش بتونیم جایگزینی قرار بدیم


مهدی
تخصص : برنامه نویس و طراح وب
@mrmmg 4 سال پیش مطرح شد
0

@behzadd
سلام ممنونم از راهکارتون، طبق توصیه توسعه دهنده پکیج من درخواست خودم رو در قالب یک ریکوئست ajax به سوی سرور میفرستم و Job خیلی راحت Dispatch میشه و اطلاعات کاربر توی دیتابیس ثبت میشه

هدف از نصب و استفاده از این پکیج افزایش سرعت لودینگ وبسایت هست و من تو پروژه های وردپرس مختلفی ازش استفاده کردم و اوکی بوده، به همین منظور قصد کردم از همین قابلیت در لاراول هم استفاده کنم که سرعت لودینگ رو در برخی از صفحات سبک تا زیر 1 ثانیه هم کاهش میده و خوبه
البته از طریق پنل ادمینی که نوشتم هر لحظه میتونم کش رو پاک کنم و مشکلی نیست.

راهکار دیگری سراغ دارید؟


woz
تخصص : fan of open source world
@wozniak 4 سال پیش مطرح شد
2

@mrmmg
پکیج جالبی به نظر می رسه.
مرسی، من هم چیز جدیدی یاد گرفتم


مهدی
تخصص : برنامه نویس و طراح وب
@mrmmg 4 سال پیش مطرح شد
1

@behzadd
خواهش میکنم، ممنونم که وقت گذاشتید
من بعلت درخواست کارفرما پروژه رو، روی یک هاست سی پنل با امکان دسترسی به ترمینال راه اندازی کردم و چون کارفرما از سرعت شکایت کرده بود مجبور به استفاده از این پکیج شدم و خب مشکلاتی پیش اومد که با کمک شما حل شد، از کمکتون ممنونم، یک دنیا تشکر 🌹🌹🌹


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام