Panic Dev – Telegram
Panic Dev
1.11K subscribers
123 photos
29 videos
2 files
132 links
Panic Dev; your Panic's solution 🔥

🍿 Telegram
🔰 t.me/PanicDev

🍿 Laravel Community
🔰 t.me/LaravelGroups

😇 Contact Me
🔰 t.me/MentionHex

Thanks for sharing us 💛
Download Telegram
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍1
لاراول cloud هم ریلیز شد 🔥
هم اکنون میتوانید ثبت نام کنید 😊

https://app.laravel.cloud/sign-up
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9
Deployed by Laravel Cloud 🤩

https://cloudy-develop-tgs3td.laravel.cloud
🔥9👍2
🚀 خوب Laravel 12 و قابلیت جدید `when()` با Closure!


توسعه‌دهنده‌های لاراول، احتمالاً با متد when() آشنا هستین، ولی می‌دونستین که توی Laravel 12 به بعد حالا می‌تونین از Closure به‌عنوان شرط استفاده کنین؟ 🤌


💡 چرا این قابلیت مهمه؟
چون باعث می‌شه شرط‌های پیچیده‌تر رو به‌شکل خواناتر و تمیزتر بنویسیم!


مثال:

$taxRate = when(
$country === 'US',
fn() => 0.07, // ۷٪ مالیات برای آمریکا
fn() => 0.2 // ۲۰٪ مالیات برای سایر کشورها
);


یا برای تعیین مهلت پرداخت فاکتور:

$invoiceDueDate = when(
fn() => $user->isVIP() && now()->isWeekday(),
fn() => now()->addDays(10), // کاربران VIP ده روز اضافه دارند
fn() => now()->addDays(5) // کاربران عادی پنج روز اضافه دارند
);


نتیجه؟ کد تمیزتر، خواناتر و انعطاف‌پذیرتر! 😎

@panicdev
🔥16❤‍🔥1👍1
🚀 معرفی defer در لاراول

لاراول یه helper به اسم defer داره که می‌تونین بعضی از پردازش‌ها رو بعد از ارسال پاسخ اجرا کنین، بدون نیاز به صف‌ها! 🎯

🔹 مثال ساده:

Route::get('/', function () {
defer(function () {
sleep(3);
\Log::info('Some log');
});

return response(' پاسخ ارسال شد');
});


پاسخ فوراً به کاربر نمایش داده می‌شه، اما بعد از ۳ ثانیه، لاگ ذخیره می‌شه!

🔹 کاربرد واقعی:
مثلاً توی یه صفحه‌ی مشاهده دوره آموزشی، می‌خوایم دوره رو به عنوان "در حال پیشرفت" برای کاربر علامت بزنیم، ولی این عملیات نیازی نداره که قبل از نمایش صفحه اجرا بشه:

defer(fn () => $this->addCourseToProgress->handle(auth()->user(), $course));


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

🔥 چرا defer بهتر از صف‌هاست؟
✔️ برای کارهای سبک و سریع که نیاز به اجرا در لحظه ندارن.
✔️ نیازی به تنظیمات صف و اجرای queue:work نداره.
✔️ پردازش بعد از ارسال پاسخ انجام می‌شه، بدون تأخیر در نمایش صفحه!

⚠️ بهتره برای کارهای سنگین مثل پردازش ویدیو از صف‌ها استفاده کنین، نه `defer`!

نتیجه: یه ابزار عالی برای بهینه‌سازی درخواست‌های لاراول! 🚀
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
🛠 چطور `defer` در لاراول کار می‌کند؟

در نگاه اول، ممکنه فکر کنین که defer یه چیزی شبیه صف‌ها (queues) هست، ولی در واقع اینطور نیست!

لاراول از طریق Middleware مخصوص به نام InvokeDeferredCallbacks پردازش‌های defer رو بعد از ارسال پاسخ اجرا می‌کنه.

🔍 پشت صحنه اجرای defer
📌 لاراول متدی به نام terminate داره که بعد از ارسال پاسخ، توابع defer ذخیره‌شده رو اجرا می‌کنه:


class InvokeDeferredCallbacks
{
public function terminate(Request $request, Response $response)
{
Container::getInstance()
->make(DeferredCallbackCollection::class)
->invokeWhen(fn ($callback) => $response->getStatusCode() < 400 || $callback->always);
}
}


یعنی اگه پاسخ موفقیت‌آمیز باشه (کد ۲xx یا ۳xx)، توابع defer اجرا می‌شن!


🤔 چطور لاراول بعد از ارسال پاسخ، defer رو اجرا می‌کنه؟
شاید عجیب باشه، چون درخواست کاربر تموم شده و پاسخ ارسال شده، ولی چطور defer هنوز اجرا می‌شه؟ 🤔

دلیلش اینه که PHP روی FastCGI اجرا می‌شه که اجازه می‌ده پردازش بعد از ارسال پاسخ هم باز بمونه و اجرا بشه!

📌 ترتیب اجرای defer در لاراول

1️⃣ کاربر / رو باز می‌کنه.
2️⃣ لاراول کال‌بک defer رو ذخیره می‌کنه (ولی اجرا نمی‌کنه).
3️⃣ پاسخ (response) فوراً به کاربر نمایش داده می‌شه.
4️⃣ (پردازش PHP هنوز باز هست) 🚀
5️⃣ لاراول متد terminate رو اجرا می‌کنه.
6️⃣ و`defer` اجرا شده و عملیات در پس‌زمینه پردازش می‌شه.
7️⃣ بعد PHP این کد رو بدون تأخیر در نمایش پاسخ، در پس‌زمینه اجرا می‌کنه.

این دقیقاً مثل queue نیست ولی شبیه اجراهای پس‌زمینه‌ای هست که بعد از ارسال پاسخ، وظایف رو اجرا می‌کنه!


@panicdev
👍7🔥1
یک سوال چالشی

من به عنوان attacker وب سایت شمارو مورد بررسی قرار میدم
و میخوام که یوزر نیم پسورد کاربران شمارو پیدا کنم !

یک روش که میتونه کار من رو راحت کنه این هستش که وقتی یوزر نیم و پسورد رو وارد میکنم
به من یک خطای واضح برگرونید
مثلا

- ایمیل وارد شده یافت نشد
- پسورد وارد شده اشتباه است .


خوب من اگه رندوم ایمیل های مختلف رو وارد کنم و یه جا به جای خطای
- ایمیل / یوزر نیم وارد شده اشتباه است ببینم که خطای پسورد وارد شده اشتباه هست رو برگردوندید .

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



حالا برای این که کار من رو سخت کنید .
میاید تحت هر شرایطی ( چه ایمیل چه پسورد ) اشتباه باشه
خطا میدید که اطلاعات وارد شده صحیح نمی باشد .


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

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

هرجایی که ریسپانس بیشتر طول کشید میفهمم که ایمیل/یوزر نیم داخل سیستم شما هست و فقط پسورد اشتباه هست .

برای این که کار من و سخت تر کنید . چه راه حلی دارید ؟ ( بدون AI بگید اگر که جوابی دارید . ) 😊
Please open Telegram to view this post
VIEW IN TELEGRAM
Panic Dev
یک سوال چالشی من به عنوان attacker وب سایت شمارو مورد بررسی قرار میدم و میخوام که یوزر نیم پسورد کاربران شمارو پیدا کنم ! یک روش که میتونه کار من رو راحت کنه این هستش که وقتی یوزر نیم و پسورد رو وارد میکنم به من یک خطای واضح برگرونید مثلا - ایمیل…
مچکرم از مشارکتتون

جواب ها تا حدی زیادی نزدیک بود ،‌ دمتون گرم
هدف تمرکز روی خود عمل بود . بدون در نظر گرفتن بلاک کردن ، ریت لیمیت و امثال این ها .


اما هدف از طرح چالش این بود که شما رو با کلاس Timebox
تو لاراول آشنا کنم که ۲۰۲۲ معرفی شد .
شاید خیلی ها تو داکیومنت دیده باشیدش ولی نمیدونستید کاربرد واقعیش چی بوده . و یا کجا میشه ازش استفاده کرد
یا اینکه با این حمله و مفهوم Timeless Timing Attack اشنا نبودید


لاراول برای چنین چالش هایی که فقط برای لاگین نیستش
میتونه برای عملیات کریپتوگرافی هم باشه . امده این کلاس و فیچر و اضافه کرده😊

که مثالش میشه این




protected function hasValidCredentials($user, $credentials)
{
return $this->timebox
->call(function ($timebox) use ($user, $credentials) {
$validated = ! is_null($user)
&& $this->provider->validateCredentials($user, $credentials);

if ($validated) {
$timebox->returnEarly();

$this->fireValidatedEvent($user);
}

return $validated;
}, 200 * 1000);
}



اگر علاقه دارید برای توضیحات بیشتر میتونید این لینک هارم مشاهده نمایید .

🔗 داکیومنت
🔗مقاله مربوطه


@panicdev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2
حال دولوپرا تا چند هفته 🫣
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣24👍2🌚2😁1
لایووایر توی نسخه جدیدش چندتا دایرکتیو و تابع جدید معرفی کرده 🥳

wire:text
wire:show
wire:cloak
wire:transition
$js(...)
$this->js(...)

اول از همه این‌که شما به سادگی و با ران کردن
composer update livewire/livewire

میتونید به راحتی این آپدیت رو دریافت کنید و از این فیچرها استفاده کنید 📝


حالا هرکدوم از این موارد چیکار میکنن؟ 🙄

با استفاده از wire:text میتونید به راحتی متن پروپرتی‌تون رو توی المان های blade قرار بدید
public int $likes = 85;

توی Blade به این‌صورت عمل کنید
<span wire:text="likes"></span>

نتیجه این میشه که 85 توی spanتون قرار میگیره 🤟


با استفاده از wire:show میتونید بر اساس یک پروپرتی توی کلاس کامپوننت؛ یک المان از blade رو نمایش بدید یا مخفی کنید
public bool $showModal = false;

توی Blade به این‌صورت عمل کنید
<div wire:show="showModal"></div>

و زمانی که مقدار showModal برابر با true بشه، div شما نمایش داده میشه.

حتی میتونید از transition ها برای انیمیت کردنش استفاده کنید


مستندات توابع و دایرکتیو هارو میتونید از داکیومنت ببینید 🙄

⭐️ wire:text docs
⭐️ wire:show docs
⭐️ wire:transition docs
⭐️ wire:cloak docs
⭐️ $js & this->js() docs
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥9👍9
همه چی عالی !
جای شما خالی ....
🤣18👍1🔥1🕊1🌚1
بحث #دیتابیس #mysql

داشتم یک مطلبی میخوندم ،‌ به یک دستوری اشاره کرد به اسم ANALYZE کنجکاو شدم که بدونم به چه کاری میاد و باهاش میشه چیکار کرد .

مواردی که تونستم در بیارم زیاد نبود ،‌
ولی یه خلاصه و چند مورد از سناریو هایی که بهتر هست از این دستور استفاده کنیم رو بخوام بگم. این هستش که :

دستور ANALYZE TABLE یک دستور مفید برای به‌روزرسانی آمار داخلی جدول که به بهینه‌سازی اجرای کوئری‌ها کمک میکنه !

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


زمانی که بعد از تغییرات بزرگ در داده‌ها، کوئری‌ها کند شدند.
زمانی که بعد از افزودن ایندکس، ایندکس استفاده نمی‌شود.
زمانی که MySQL به جای استفاده از ایندکس، کل جدول را اسکن می‌کند.
زمانی که بعد از بازیابی بکاپ، سرعت پایگاه داده کاهش یافته است.
زمانی که جدول را با OPTIMIZE TABLE بهینه کرده‌اید.



✴️ نکات و best practices
🔹 تحلیل منظم: به‌طور مرتب دستور ANALYZE TABLE را روی جداولی که تغییرات داده‌ای زیادی دارند اجرا کنید تا عملکرد کوئری‌ها حفظ شود.

🔹 پایش عملکرد: این دستور را به‌عنوان بخشی از نگهداری دوره‌ای اجرا کنید، به‌ویژه پس از عملیات حجیم روی داده‌ها، تا آمارها به‌روز بمانند.

🔹 توجه به سربار پردازشی: در نظر داشته باشید که ANALYZE TABLE ممکن است هنگام تجزیه و تحلیل، جداول را قفل کند که می‌تواند بر عملیات همزمان تأثیر بگذارد. بهتر است آن را در ساعات کم‌بار اجرا کنید تا اثرات منفی کاهش یابد.

🔹 سازگاری با موتورهای ذخیره‌سازی: این دستور در موتورهای ذخیره‌سازی مانند InnoDB و MyISAM پشتیبانی می‌شود اما ممکن است برای همه موتورهای ذخیره‌سازی قابل استفاده نباشد. قبل از استفاده، از سازگاری آن اطمینان حاصل کنید.

🔹 اجرای خودکار: در برخی شرایط، MySQL ممکن است به‌طور خودکار ANALYZE TABLE را اجرا کند، اما اجرای دستی آن تضمین می‌کند که آمارها به‌روز باشند.

🔹 ارزیابی اثربخشی: برای بررسی تأثیر ANALYZE TABLE، برنامه‌های اجرای کوئری (Execution Plan) را قبل و بعد از آن مقایسه کنید. اگر موتور ذخیره‌سازی شما از آن پشتیبانی نمی‌کند یا باعث افت عملکرد قابل‌توجهی می‌شود، از اجرای آن خودداری کنید.


نکته اضافه :

دستور EXPLAIN ANALYZE در MySQL هم داریم که اطلاعات دقیقی درباره‌ی برنامه‌ی اجرای کوئری میده ،‌ از جمله جزئیات مربوط به تصمیمات بهینه‌ساز، روش‌های دسترسی و هزینه‌های تخمینی. برخلاف EXPLAIN که فقط طرح اجرای کوئری را بدون اجرای واقعی آن نمایش میده EXPLAIN ANALYZE کوئری را اجرا میکنه و آمار زمان اجرا را ارائه می‌کند. این ویژگی یک ابزار ارزشمند برای تحلیل عملکرد کوئری‌ها و شناسایی نقاط قابل بهبود .


منابع که شاید برای مطالعه بیشتر دوست داشته باشید .

- لینک
- لینک
-لینک


#تجربه

خیلی دوست دارم کسانی که تجربه کار با این کامند داشتند ، تجربیاتشون رو با ما به اشتراک بگذارند . تاثیراتی که روی دیتابیس و کوئری ها بوده به چه صورتی بود و چقدر تائیر گذار داشته ، آیا این رو به صورت دوره ای schedule کردن ؟
ایا تجربه بدی هم ازش داشتن .
آیا اطلاعات بیشتری یا سناریو هایی بیشتری میشناسید که از این کامند استفاده کنیم ؟


با اشتراک گذاری اطلاعاتتون مارا خوشحال کنید .
سپاس

@panicdev
👍6
🚀 پکیج GPDF یک پکیج PHP/Laravel برای تولید PDFهای عربی، راست‌چین (RTL) و چندزبانه است که به‌صورت بومی از ۱۷ فونت عربی داخلی پشتیبانی می‌کند. این پکیج با پشتیبانی از فضای ابری S3 بر اساس DomPDF توسعه یافته و مشکلات رندر متن عربی را حل کرده است، در عین حال قابلیت‌های مدرنی را برای اسناد، فاکتورها و گزارش‌ها اضافه می‌کند.


https://github.com/omaralalwi/Gpdf



#package

@panicdev
🔥9👍4
حتماً برات پیش اومده که بخوای از سرورهای ایران به وب‌سرویس ربات‌های تلگرام وصل بشی، ولی همیشه کلی دردسر داشتی. خوب، یه راه‌حل ساده، رایگان و بی‌دردسر برات دارم که می‌تونی راحت ازش استفاده کنی! 🚀

راه حل چیه؟
Cloudflare Workers

سرویس Cloudflare Workers این امکان رو بهت می‌ده که یه قطعه کد یا پروژه رو روی ساب‌دامین خودت یا حتی ساب‌دامین workers.dev (که خود کلادفلر ارائه می‌ده) اجرا کنی. این سرویس کاملاً رایگانه و استفاده ازش خیلی ساده‌ست.

🎯 چطور راه‌اندازی کنیم؟
خیلی راحت:
1. تو Cloudflare ثبت‌نام کن.
2. یه Worker جدید بساز.
3. این کد رو توش کپی کن:

export default {
async fetch(request, env, ctx) {
const requestClone = request.clone();
try {
const url = new URL(request.url);
const targetUrl = `https://api.telegram.org${url.pathname}${url.search}`;
const telegramRequest = new Request(targetUrl, {
method: request.method,
headers: request.headers,
body: request.method !== 'GET' && request.method !== 'HEAD' ? await requestClone.blob() : undefined,
});
const response = await fetch(telegramRequest);
return new Response(await response.clone().blob(), {
status: response.status,
statusText: response.statusText,
headers: response.headers,
});
} catch (error) {
return new Response(`Proxy Error: ${error.message}`, { status: 500 });
}
},
};


🚀 چطور ازش استفاده کنیم؟
وقتی Worker رو دیپلوی کردی، یه دامنه اختصاصی براش می‌گیری. حالا کافیه به‌جای این که درخواست‌هات رو به api.telegram.org بفرستی، به دامنه Worker خودت بفرستی و همون جواب رو بگیری. 🎉

💡 چرا این روش عالیه؟
کاملاً رایگان و بدون نیاز به سرور
نیازی نیست کدهای اصلی باتت رو تغییر بدی
سرعت بالا و بدون محدودیت دسترسی
امکان استفاده روی دامنه اختصاصی

برای جزئیات بیشتر، یه سر به مستندات Cloudflare Workers بزن. 😉

Happy Coding! 🥳
@PanicDev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍10❤‍🔥5
واقعا بعضیا خودشونو مسخره کردن 😐

بعد همینا میگن :
بابا ما آگهی میزنیم نیرو کار نیست .
دیگه کسی کار نمیکنه
یا همه روزمه هایی که میفرستن سطح پایین جونیور
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣15👍3
#نکات دیتابیسی

شما یه جدول درست میکنی که تراکنش های هر کاربر رو ذخیره میکنه
مثلا میگه کاربر شماره X امده ۲۰ دلار در تاریخ فلان تراکنش انجام داده .

بعد اینو به زیبایی با یک میلیون رکورد پر میکنید . به وسیله PROCEDURE عزیز .

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

 
SELECT user_id, SUM(amount) AS total_amount
FROM transactions
GROUP BY user_id;


خوب این کوئری ظاهرا ۱۵۰ ثانیه زمان لازم داره


چیکار کنیم ۱۵۰ ثانیه بشه ۲ ثانیه

@panicdev
گفتند که
اگر به جدول یه index برای user_id در نظر بگیرید

از ۱۵۰ ثانیه میشه ۸۰ ثانیه .

خوبست ،‌ دیگه چیکار کنیم ؟

@panicdev
گفتند که بیایم بر اساس transaction_date
جدول و پارتیشن بندی کنیم .

اینجوری سرعت کوئری از ۸۰ میرسه به ۲۰ .

من خودم روی صحت این قضیه شک دارم . چون که برای کوئری کلی مثل این ( گزارش تمام کاربر ها در تمام سال هارو بخوایم بگیریم ). نباید تاثیر خاصی داشته باشه .

ولی در عوض اگه بگیم گزارش همه کاربر هارو برای سال ۲۰۲۱ بده . خیلی باید تاثیر گذار و سریع باشه .


نظر شما چیست ؟

@panicdev
خوبه ،‌ دوستان اشارات خوبی کردن ، مچکریم

بعله ،‌ میریم سراغ Materialized

اینجا میگه یه جدول جدا میکنی روی
user_transaction_sums

بعد یه cron درست میکنی برای اونت
update_user_sums

که این میاد scheduler میکنه ،‌ هر یک ساعت یکبار ، محاسبات رو مجدد روی جدول انجام بده

و جدول شبه Materialized رو براتون آپدیت کنه .


الان میتونید از این کوئری بگیرید در حد ۲ ثانیه خروجی رو ببینید.

@panicdev
👍4
آقا ،‌ دید مثلا این سایت های بزرگ
وقتی یه درخواستی میزنی ،‌ به هر دلیلی میخوره تو دیوار ،‌ یه پیام نشونت میده .

میگه که این درخواست شما رفت تو دیوار ،
این UUID خدمت شما (که مربوط به درخواست میشه ) بردار ببر پشتیبانی پیگیری کن


حالا سوال پیش میاد که این UUID چی هست ؟
و چطور از روی اون میفهمن که شما بودید و چیکار داشتید میکردید که به این خطا خوردید .


خوب یه بنده خدایی امده مفهوم Context رو معرفی کنه .
و این مثال رو زده ،
گفته شما میتونید در ابتدای امر یه UUID بسازید و به درخواست اتچ کنید .
و این رو در جاهای مختلف که خواستید لاگ بندازید ازش استفاده کنید .

مثلا :
یه API کال میشه . اینو همون اول اتچ میکنید به API و هرجایی که خواستید لاگ بندازید .
اینو از Context برمیدارید و لاگ و همراه با متعلقاتش و این UUID ثبت میکنید .

(شاید بگید من همونو مریزم داخل request ، از همون جا هم بر میدارم ، Context نمندی .
خوبه ولی جاهایی مثل جاب ها دیگه بهش دسترسی نداری. )


آما ،
یه نکته به چشم خورد (تصویر دوم )
امده گفته که شما میتونی یه Middleware بنویسی و بزارید برای API تا بتونید Status , response time اینارو در بیارید به Context اضافه کنید .


ولی بنظرتون این کد درسته ؟ و جای درستی نوشته شده ؟


@panicdev
👍3