منبع: chatgpt
در PHP، یک Generator به شما امکان میدهد که به جای بازگشت تمامی مقادیر یکجا از یک تابع، هر مقدار را در هر بار اجرا به صورت تدریجی تولید کنید. این ویژگی به صرفهجویی در حافظه و پردازش دادههای بزرگ کمک میکند، بهویژه زمانی که نیاز به پردازش یا پیمایش مجموعهای از دادهها به صورت تدریجی باشد.
Generators با استفاده از کلمه کلیدی yield
تعریف میشوند. هر بار که تابع generator فراخوانی میشود، تا جایی که به yield
برخورد کند اجرا میشود، مقدار را برمیگرداند و سپس وضعیت خود را حفظ میکند تا در فراخوانی بعدی از همان نقطه ادامه یابد.
مثال ساده:
function simpleGenerator() {
yield 1;
yield 2;
yield 3;
}
$gen = simpleGenerator();
foreach ($gen as $value) {
echo $value; // خروجی: 1 2 3
}
کاربرد:
- صرفهجویی در حافظه: به جای اینکه یک آرایه بزرگ از مقادیر را به طور کامل در حافظه نگه دارد، به تدریج مقدار تولید میکند.
- پردازش دادههای بزرگ: در مواقعی که نیاز به پردازش مجموعه بزرگی از دادههاست (مانند خواندن خطوط یک فایل)، generator به شما امکان میدهد دادهها را به صورت قطعهقطعه پردازش کنید.
مثال کاربردی (خواندن فایل):
function readFileLines($file) {
$handle = fopen($file, 'r');
while (!feof($handle)) {
yield fgets($handle);
}
fclose($handle);
}
foreach (readFileLines('largefile.txt') as $line) {
echo $line;
}
نتیجه: این ویژگی به شما اجازه میدهد که بدون استفاده از حافظه اضافی، فایلهای بزرگ را به صورت خط به خط بخوانید و پردازش کنید.
در لاراول کجا از php generator استفاده شده است؟
در لاراول، از PHP Generators در قسمتهای مختلف فریمورک برای بهبود کارایی و مدیریت حافظه بهخصوص در کار با مجموعههای بزرگ داده استفاده شده است. یکی از مهمترین موارد استفادهی generator در لاراول مربوط به Eloquent و Cursor است.
Eloquent Cursor:
هنگامی که شما نیاز دارید رکوردهای زیادی از دیتابیس را پردازش کنید ولی نمیخواهید تمام آنها را به یکباره در حافظه بارگذاری کنید، میتوانید از متد cursor
استفاده کنید. این متد از generator استفاده میکند تا رکوردها را به صورت تدریجی و بهینهسازی شده بارگذاری کند.
$users = \App\Models\User::cursor();
foreach ($users as $user) {
echo $user->name;
}
در اینجا cursor()
به جای اینکه تمام کاربران را به یکباره از دیتابیس بارگذاری کند (که ممکن است منجر به مشکلات حافظه شود)، از generator استفاده میکند تا رکوردها را یکییکی در هر بار فراخوانی yield
کند. این روش بسیار کارآمد است، به خصوص زمانی که حجم بزرگی از دادهها باید پردازش شود.
موارد استفاده:
- مدیریت کارآمد حافظه: در شرایطی که نیاز به پردازش تعداد زیادی از رکوردها دارید و نمیخواهید کل دادهها به یکباره در حافظه بارگذاری شوند.
- پردازش رکوردهای حجیم: مثلاً در یک job طولانیمدت برای پردازش یا ایجاد گزارشات، میتوان از
cursor()
استفاده کرد تا رکوردها بهصورت پیوسته و کارآمد خوانده شوند.
نتیجه: استفاده از generator در لاراول در متدی مثل cursor()
امکان مدیریت بهینهتری برای مجموعههای بزرگ داده فراهم میکند و از مصرف بیرویهی حافظه جلوگیری میکند.