زمان کار با دادههای حجیم و مهم برگردوند همه اون ها باعث میشه که برنامهتون کارایی خودش رو از دست بده و با مشکل حافظه مواجه بشه.
لاراول یه راهحل خیلی جالب برای این کار پیشنهاد میده به اسم streamJson.
این قابلیت زمانی به کمک شما میاد که نیاز دارید به تدریج دیتاها رو در قالب json به کاربر ارائه بدید 😁.
این قالبت توی Laravel 10.43 ارائه شده و باید قبل از هرکاری پروژه خودتون رو آپدیت کنید!
درک streamJson
متد streamJson توی لاراول، که از طریق Response قابل دسترسیه، بهت این امکان رو میده که دادههای JSON رو مرحلهبهمرحله استریم کنی. این روش باعث میشه برنامه سریعتر و
کممصرفتر از نظر حافظه کار کنه و برای کار با دیتاستهای بزرگ یه گزینهی عالی باشه.
response()->streamJson(['data' => $yourDataset]);Code language: PHP (php)
مثال واقعی
بیاید یه مثال واقعی بزنیم، فرض کنید قراره یه لیست خیلی بزرگ از محصولات پروژه رو به کاربر نشون بدید با بعضی از رابطههاش.
<?php
namespace App\Http\Controllers;
use App\Models\Inventory;
class InventoryController extends Controller
{
public function list()
{
return response()->streamJson([
'inventory' => Inventory::with('supplier', 'variants')->cursor()->map(function ($item) {
return [
'id' => $item->id,
'sku' => $item->sku,
'quantity' => $item->quantity,
'supplier' => $item->supplier->name,
'variants' => $item->variants->pluck('name'),
];
}),
]);
}
}Code language: HTML, XML (xml)
توی این مثال، ما از eager loading استفاده کردیم که از درخواست اضافه به دیتابیس جلوگیری کنیم.
از متد cursor هم استفاده کردیم که نیاز نباشه دادهها رو یکجا از دیتابیس بگیرم.
در واقع متد cursor یه connection با دیتابیس برقرار میکنه و ایتم هارو یک به یک از دیتابیس میخونه و stream میکنه و با کمبود حافظه مواجه نمیشیم.
خروجی کد بالا میشه
{
"inventory": [
{
"id": 1,
"sku": "INV-001",
"quantity": 150,
"supplier": "Global Supplies Inc",
"variants": ["red", "blue", "green"]
},
{
"id": 2,
"sku": "INV-002",
"quantity": 75,
"supplier": "Quality Goods Ltd",
"variants": ["small", "medium"]
},
// ... other inventories
]
}Code language: JSON / JSON with Comments (json)
متد streamJson این امکان رو به پروژه شما اضافه میکنه که داده هارو به تدریج ارسال کنه و به مرورگر امکان نمایش دیتاها قبل از کامل شدنشون رو میده.
این متد یک راه حل خیلی عالی و ارزشمند برای کار با دیتاهای بزرگ به شما ارائه میده 😁
امیدوارم از این مقاله خوشتون آمده باشه 👋

