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
🚀 معرفی Laravel RagKit: دستیار هوشمند اسناد برای پروژه‌های لاراولی شما!

تا حالا دوست داشتید اپلیکیشن Laravel شما بتونه به‌صورت هوشمند به سوالات درباره مستندات پاسخ بده؟
با Laravel RagKit آشنا بشید — ابزار قدرتمند RAG (تولید تقویت‌شده با بازیابی) مخصوص لاراول!

🎯 مشکلاتی که حل می‌کنه:

* دیگه نیازی به جستجوی دستی توی اسناد نیست
* پاسخ‌های دقیق و وابسته به متن
* پردازش خودکار مستندات
* تعامل به سبک چت با اسناد شما

💡 مثال ساده:
فرض کنید یه SaaS دارید با مستندات زیاد. به جای اینکه کاربرها توی مستندات سردرگم بشن:

1️⃣ مستندات رو آپلود کنید:

RagKit::uploadDocument(
$collection,
'user-guide.pdf',
[
'category' => 'documentation',
]
);


2️⃣ اجازه بدید کاربرها سوال بپرسن:

$answer = RagKit::ask(
$collection,
"چطور رمز عبورم رو ریست کنم؟",
null,
[]
);


3️⃣ جواب‌های هوشمند همراه با منبع دریافت کنید! 🎉

🔥 ویژگی‌های مهم:
• پردازش Async
• پشتیبانی از چند ارائه‌دهنده
• گفت‌وگوهای چتی
• خلاصه‌سازی و FAQ اسناد
• یکپارچه با لاراول

⚙️ شروع سریع:

composer require mohaphez/laravel-ragkit


🔗 لینک پروژه:

laravel-ragkit

#Laravel #هوش_مصنوعی #RAG #PHP #مستندسازی

@panicdev
13🔥11👌3❤‍🔥1👍1😁1
خوب صحبت از Octane شد، گفتیم یه بررسی داشته باشیم تا در انتخاب استفاده ازش دقت لازم داشته باشید .


🚀 فرق بین Laravel یا Laravel Octane چیست ؟

باید گفت Laravel Octane یه نسخه جدا نیست، بلکه یه افزونه‌ست که روی Laravel اجرا می‌شه و مخصوص PHP 8 به بالاست.
هدفش فقط یه چیزه: سرعت! ⚡️

⚙️ مقایسه‌ی سرعت

در Laravel معمولی: حدود ۵۰۰ درخواست در ثانیه

در Laravel Octane: راحت بالای ۲۰۰۰ درخواست در ثانیه!
اونم با حداقل ۱۰ برابر عملکرد بهتر 🤯

🧠 چرا Octane اینقدر سریع‌تره؟
تو Laravel معمولی، هر درخواست باعث می‌شه PHP از اول همه چیزو لود کنه (بوت اپلیکیشن، سرویس‌ها، کانفیگ‌ها و...).
ولی تو Octane، همه اینا فقط یه بار لود می‌شن و بعدش تو حافظه می‌مونن، یعنی هر درخواست بعدی خیلی سریع‌تر انجام می‌شه!

💡 پس Octane باهوش‌تره و تکرارای اضافی رو حذف می‌کنه.

🌐 سرورهای Octane فرق دارن
خود Laravel معمولاً روی Apache یا Nginx با PHP-FPM اجرا می‌شه.
ولی Octane از Swoole یا RoadRunner به‌عنوان سرور استفاده می‌کنه و ترافیک باید به اینا هدایت بشه.

🧩فرق Stateful یا Stateless چیه؟
لاراول معمولی «Stateless»‌، یعنی هر درخواست جداست.
ولی Octane «نیمه-Stateful»‌، یعنی یه سری اطلاعات بین درخواست‌ها تو حافظه می‌مونه.

📌 مثال واقعی:
تو حالت Stateless، هر بار که صفحه‌ای باز می‌کنی، سرور بررسی می‌کنه که لاگین هستی یا نه.
تو حالت Stateful (مثل Octane)، سرور همون‌طور که وارد شدی، اطلاعاتت رو نگه می‌داره تا وقتی logout کنی!

🔧خوب Swoole یا RoadRunner؟ کدوم بهتره؟

میشه گفت Swoole سریع‌تره ولی باید روی PHP نصب بشه، با Xdebug و مانیتورینگ‌ها خوب کار نمی‌کنه.

درحالی که RoadRunner راحت‌تر نصب می‌شه و به تنظیم خاصی نیاز نداره، ولی کمی کندتر از Swoole‌.

🤔 بالاخره Octane رو استفاده کنیم یا نه؟
بله، اگه سایتت زیر بار سنگینه یا سرعتش اذیتت می‌کنه
نه، اگه با PHP 8 سازگار نیستی یا تیمت هنوز با مفاهیم stateful آشنا نیست

#Laravel #PHP #Octane

@panicdev
👍15🔥1
🚀خوب Laravel Octane واقعاً فوق‌العاده‌ست، اما...

همانطور که میدونید Laravel Octane به‌خاطر افزایش چشمگیر سرعت اپلیکیشن‌ها خیلی محبوب شده. چون حافظه‌ی اپ بین درخواست‌ها حفظ می‌شه، دیگه هر بار لازم نیست از اول بارگذاری بشه.
ولی همونطور که دوستمون @Mahdi_Saremi گفت باید ها و نباید ها دارد .
قبل از اینکه سریع بری سراغ استفاده ازش، باید یه‌سری نکات مهم رو بدونی تا سرت به سنگ نخوره! 🧠

👇 چند مورد از محدودیت‌ها و نکات مهم Octane رو باهم مرور کنیم:

🔁 1. برنامه دیگه Stateless نیست!

تو لاراول معمولی، هر درخواست از صفر اجرا می‌شه. ولی تو Octane همه چیز تو حافظه می‌مونه!
یعنی اگه تو یه درخواست یه متغیر مثل $user ست بشه و پاک نشه، ممکنه درخواست بعدی هم همون مقدار رو ببینه! 😱
حتماً از Octane::reset() یا tick/booting برای پاک‌سازی وضعیت استفاده کن.

🔌 2. همه پکیج‌ها با Octane سازگار نیستن!

یه‌سری پکیج‌ها مثل پکیج‌های سشن یا احراز هویت که به lifecycle معمولی PHP وابسته‌ان، ممکنه تو Octane درست کار نکنن.
قبل از استفاده از هر پکیجی، بررسی کن با Octane سازگاره یا نه. اگه ناسازگاره یا عوضش کن یا resetش کن.

🧠 3. نشت حافظه (Memory Leak)

چون پردازش‌ها طولانی‌ان، حافظه می‌تونه پر بشه و اپت کند یا حتی داون بشه!
با تنظیم max_requests بعد از یه تعداد خاصی درخواست، worker رو ری‌استارت کن. حواست به مصرف رم باشه.

📦 4. مناسب کارای طولانی نیست

بله Octane برای درخواست‌های سریع و زیاد ساخته شده. کارای سنگین مثل آپلود فایل یا پردازش تصویری رو می‌تونه قفل کنه.
این کارا رو بده به Queue یا jobهای پس‌زمینه.

🔀 5. محدودیت تو هم‌زمانی (Concurrency)
بسته به اینکه از Swoole یا RoadRunner استفاده می‌کنی، یه‌سری مشکلات خاص ممکنه پیش بیاد، مثل هم‌زمان نوشتن روی فایل.
از lock و عملیات اتمی استفاده کن. اپ رو قبل از دیپلوی حسابی تست کن.

🐞 6. دیباگ و تست کردن عجیب می‌شه!

دیگه مثل قبل نمی‌تونی راحت dd() بزنی و نتیجه بگیری. چون ممکنه state قبلی تو worker هنوز بمونه!
از ابزارهایی مثل Clockwork یا Laravel Debugbar استفاده کن. Log بگیر و از رویدادهای reset کمک بگیر.

🚀 7. تغییر تو دیپلوی و CI/CD

اگه بعد از دیپلوی workerها رو ری‌استارت نکنی، اپ ممکنه با کد یا تنظیمات قدیمی اجرا بشه!
از ابزارهایی مثل Envoyer استفاده کن. حتماً بعد از دیپلوی بزن:
php artisan octane:restart


⚠️ جمع‌بندی
خوب Octane واقعاً عالیه برای اپ‌هایی که درخواست زیاد و سریع دارن. ولی باید با دقت و آگاهی ازش استفاده کنی، چون اگه آماده نباشی، ممکنه بیشتر از اینکه کمک کنه، دردسر درست کنه.


اینم یه ریپازیتوری که best-practice های مربوط به اکتان رو اوردن

laravel-octane-best-practices

#Laravel #PHP #Octane

@panicdev
1👍19🔥2👌1
Live stream scheduled for
فردا ساعت ۸ شب؛ یک وبینار درمورد Text Embedding و وکتورایز کردن متن و ذخیره اون‌ها توی Vector Database ها خواهیم داشت و درنهایت وکتور دیتابیسمون رو به یک LLM متصل میکنیم تا کاربر بتونه با زبان طبیعی توی داده‌ها سرچ بزنه و به نتیجه برسه.

مثلا: "چه غدایی با گوشت، سیب زمینی و گوجه میتونم درست کنم؟" و سیستم بر اساس داده ها نزدیک ترین پیشنهادات رو به کاربر درقالب متن + لینک به رسپی ها بده
👍12👌5
Panic Dev
فردا ساعت ۸ شب؛ یک وبینار درمورد Text Embedding و وکتورایز کردن متن و ذخیره اون‌ها توی Vector Database ها خواهیم داشت و درنهایت وکتور دیتابیسمون رو به یک LLM متصل میکنیم تا کاربر بتونه با زبان طبیعی توی داده‌ها سرچ بزنه و به نتیجه برسه. مثلا: "چه غدایی با…
🔔 اساتیدی که قصد دارید امشب توی لایو تشریف بیارید - از اون‌جایی که قصد نداریم زیاد طولانیش کنیم یک‌سری توضیحات و مقدمات رو به صورت متنی براتون میزارم اما چون تعدادشون زیاده و با موضوع این کانال ارتباط چندانی نداره توی چنل شخصیم میزارمشون (به صورت Silent Broadcast) — فرض بر این‌هست که تمام این مطالب رو خونده باشید و بعد به لایو جوین بشید.

از اینجا مطالب رو دنبال کنید:
https://news.1rj.ru/str/ArminNotes/157

* کانال پابلیکه و نیاز نیست جوین بدید اگه علاقه‌ای ندارید — بعدا نگید تبلیغ میکنه :)))
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤‍🔥2🔥1
Panic Dev
🔔 اساتیدی که قصد دارید امشب توی لایو تشریف بیارید - از اون‌جایی که قصد نداریم زیاد طولانیش کنیم یک‌سری توضیحات و مقدمات رو به صورت متنی براتون میزارم اما چون تعدادشون زیاده و با موضوع این کانال ارتباط چندانی نداره توی چنل شخصیم میزارمشون (به صورت Silent Broadcast)…
توضیحات اولیه پس از ۳ ساعت تموم شد 😁

با احترام فراوان اگه قراره امشب تشریف بیارید توی لایو این موارد رو بخونید - من با این فرض که شما تمام مطالب رو خوندید و متوجه شدید صحبتارو پیش میبرم و دیگه چیزایی که الان تایپ کردم رو تکرار نمیکنم.

شروع:
t.me/ArminNotes/157
پایان:
t.me/ArminNotes/198

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

https://news.1rj.ru/str/BiChatBot?start=sc-ac97b074ad
👍3🔥2
اقا ببخشید دیگه :)) میت پرمیوم نداشتیم بیشتر از ۱ ساعت در خدمتتون باشیم.

سوالی ابهامی چیزی به وجود اومد همینجا بپرسید جواب بدم
👍6❤‍🔥4🔥1
نمیدونم راهتون به API چت بات ها خورده یا نه
ولی یه مشکلی که شاید داشته باشید این هست که
وقتی میخواید سوال کاربر و OpenAi بدید تا جواب بهتون بده .
تو حالت عادی که rest api کال میکنید . به این صورت


$client = OpenAI::client(config('services.openai.key'));

$response = $client->chat()->create([
'model' => 'gpt-4o',
'messages' => $messages,
]);

return response()->json([
'message' => $response
->choices[0]
->message,
], 200);


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

البته از نظر فرانتی امده بودن بهش انیمیشن داده بودن ،‌
وقتی جواب از API میرسید همه رو یه جا چاپ نمیکرد
مثل همون چت بات ها با انیمیشن چاپ میکرد

ولی این باعث نمیشد جواب زودتر جنریت بشه و باز اون انتظار زیاد بود


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


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

پلتفرم هایی مثل openAi این قابلیت و دارن که درخواست بدی به صورت استریم بهت جواب بدن .

ولی از طرفی شما هم باید بتونید اینو پشت صحنه بگیرید و به فرانت خودتون هم به صورت استریم نشون بدید .

برای این کار شما یه endpoint میخواید که به صورت SSE به فرانت شما وصل بشه .

بعد شما درخواستش رو به openAi میدید و میگید به صورت استریم بهم جواب بده .

وقتی جواب و میگیرید پارس میکنید و با همون SSE به فرانت خودتون بر میگردونید .

حالا کاربر شما میتونه به صورت ریل تایم جوابی که جنریت میشه رو ببینه و دقیقا همون حس رضایت چت بات واقعی رو داشته باشه .

در تصاویر هم میتونید نمونه کد سمپل رو ببنید .

شاید در آینده به دردتون خورد 😊


@panicdev
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥6🕊1
چرا لاراول sail استفاده نکنیم ...

اگر شما هم با تعداد متعددی پروژه همزمان کار میکنید یا بین پروژه های لاراولی زیاد سوئیچ میشید .

اجرا همزمان پروژه ها با sail منابع زیادی میطلبه یا باید یکی رو down کنید بعد یکی رو up یا کانفیگ و پورت متفاوت برای هرکدوم روی env ست کنید .


ولی از همه مهم تر که من دیروز باهاش برخورد کردم

اشغال فضای زیادی دیسک هست .
برای هر پروژه لاراولی که بخواید با sail اون رو راه اندازی کنید
از اول یه image براش بیلد میشه و دوباره تمام کانتیر های mysql , redis و ... براش از اول ساخته میشه .

مسئله اول ،‌اون سردرد موقع هر بار بیلد و pull که به جای خودش

ولی در این بین کلی image دارید هر بار به اضافه کلی volume

من وقتی دیروز فضای دیکسم به شدت پر شده بود امدم تمیز کاری کنم
وقتی یه docker prune زدم ۴۵ گیگ فضا ازاد شد!

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

خیلی زیاد داره فضا و اینترنت مصرف میشه .


خوب به این فک کردم بریم سراغ جایگزین .
همونطور که میدونید هستن ابزار هایی مثل herd , longhorn , valet که یا برای ویندوز یا قشر پولدار خانواده اپل

و چیز به درد بخوری پیدا نکردم که یکبار اجرا بشه و تمام پروژه ها رو ساپورت کنه . و همش در حال سوئیچ نباشم .


در اخر به این نتیجه رسیدم باید برگردم به خودم یه چیزی بزنم .

که تهش شد این ریپازیتوری ساده .


‍‍https://github.com/mohaphez/larasaur


شما با استفاده از این یه پوشه دارید به اسم projects مثلا

بعد داخلش یه فولدر میسازید dev-env و فایل های این ریپازیتوری میره داخلش

بعد یه

bash install-dev-shortcuts.sh


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

حالا پروژه هاتون میره داخل پوشه projects

مثلا با این ساختار

~/projects/
├── dev-env/
├── x/
│ ├── a-laravel/
│ └── b-laravel/
├── y/
│ ├── c-laravel/
│ └── v-laravel/
└── z/
├── h-old-laravel/
└── b-new-laravel/


همه چی امادست

اول یه دستور up میزنید

up


که بیلد اولیه گرفته بشه و سرویس ها بیاد بالا

بعد داخل هر پروژه که دارید یا جدید میسازید داخل خود مسیرش مثلا

cd  ~/projects/a-laravel 


یه دستور

addsite 


میزنید این براتون یه کانفیگ nginx میسازه میندازه برای داکر و یه دامین با پسوند .local میسازه
مثلا این میشه

a-laravel.local


و تمام

کلا بعد از این دیگه هر چی پروژه میسازید یه addsite میزنید و یه دستور restart

بعد همه چی امادست .


هم روی محیط ایزولست هم در مصرف اینترنت و وقت صرفه جویی شده هم فضای کمتری میگیره

هم روی سیستمتون نیاز به نصب دپندسی های زیادی ندارید برای راه اندازی lamp


گذاشتم شاید به درد شما هم خورد .

الان فقط زمانی سراغ sail میرم که پروژه واقعا محیط متفاوت خاصی بخواد مثل php 7.4

@panicdev
🔥13👍3❤‍🔥1
🐛
Please open Telegram to view this post
VIEW IN TELEGRAM
😁7
🎯 وقتی شرطی نوشتن قشنگ‌تر می‌شه!

🤔 میدونی Conditionable چیه؟

یه Trait جدیده که به کلاس Fluent اضافه شده و بهت اجازه می‌ده توی زنجیره‌ی متدها (method chaining) شرط بذاری، بدون اینکه if/else وسط کدت بیاد و ظاهرشو به هم بزنه.

🔁 قبل از Conditionable:

$data = Fluent::make([
'name' => 'Michael Nabil',
'developer' => true,
'posts' => 25,
]);

if (auth()->isAdmin()) {
$data = $data->set('role', 'admin');
} else {
$data = $data->forget('posts');
}


بعد از Conditionable:

$data = Fluent::make([...])
->when(auth()->isAdmin(), fn ($d) => $d->set('role', 'admin'))
->unless(auth()->isAdmin(), fn ($d) => $d->forget('posts'));


زیبا نیست؟ 😍

📦 مثال واقعی توی API Resource:


return Fluent::make([
'id' => $user->id,
'name' => $user->name,
])
->when($request->user()->can('view-statistics'), fn ($d) =>
$d->set('post_count', $user->posts()->count())
->set('comment_count', $user->comments()->count()))
->when($user->isVerified(), fn ($d) =>
$d->set('verified', true)
->set('verification_date', $user->verified_at->toDateString()))
->unless($request->includesPersonalData(), fn ($d) =>
$d->forget('email'))
->toArray();


همه چیز شرطیه، ولی هنوز قشنگ و قابل‌خونده! 🔥


🧠 نتیجه‌گیری:
با when() و unless()، می‌تونی شرط‌ها رو تو دل همون زنجیره بنویسی و خوندن کدت رو فوق‌العاده راحت کنی.
لاراول بازم یه قدم دیگه برای تجربه بهتر توسعه‌دهنده برداشته. 👨‍💻💚



منبع : مقاله

@panicdev
👍22👎3👌2🔥1
بله دوستان 😁
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
اگه دوس دارید با مفهوم اسکوپ و کوئری رجیستری توی لاراول عمیقا آشنا بشید و بتونید مثل یه Pro Player ازشون استفاده کنید این مقاله زیبا و کامل رو از دست 👀

https://laravel-news.com/query-scopes
🔥9