کاهش مصرف رم سایت با استفاده از yield در PHP

آیا در مورد yield در PHP چیزی شنیدید؟ خب من در وقتتون صرفه جویی میکنم و نیازی نیست برید سرچ کنید با سرفصل زیر در مورد yield صحبت می کنیم

  1. معرفی yield.
  2. تفاوت بین yield & return.
  3. خصوصیات yield.
  4. نتیجه گیری.



معرفی yield

بزارید یه تابع تعریف کنیم مثل بقیه توابع ولی به جای return کردن yield میکنیم مانند:

function getValues() {
    yield 'value';
}

// print the string "value"
echo getValues();

خب مسلماَ، این کد کار نمی کنه به شما یه fetal error بر میگردونه:

object of class Generator could not be converted to string

بزارید ارور رو توضیح بدیم:

تفاوت بین yield & return

اروری که بالا نوشتم میگه تابعمون string باید return میکرده ولی یه object فرستاده!!! اگه بخوایم تایپ شون رو بفهمیم:

function getValues() {
    return 'value';
}
var_dump(getValues()); // string(5) "value"

function getValues() {
    yield 'value';
}
var_dump(getValues()); // class Generator#1 (0)

کلاس Generator یه کلاسی هست که implement میشه از اینترفیس Iterator: یعنی باید از تابع getValues در حلقه ها استفاده کنیم:

foreach (getValues() as $value) {
    echo $value;
}
// using variable is also alright
$values = getValues();
foreach ($values as $value) {
    echo $value;
}

البته این تنها تفاوتش نیست

یه Generator بهت اجازه میده از حلقه ها برای یه دسته از داده ها استفاده کنی بدون اینکه آرایه ای تعریف کنی و این یعنی آرایه ای نیست که در رم ذخیره کنه و در نتیجه مصرف رم کمتر!

برای درک بهتر استفاده از yield فکر کنید یه آرایه داریم با 800,000 ایندکس و بخوایم با تابعی مثل تابع بالا return کنیم و اگر با تابع memory_get_usage() میزان رم را اندازه گیری کنیم، من در هر 200,000 المنت اندازه گیری کردم و نتیجه اش:

0.34MB
8.35MB
16.35MB
32.30MB

خب بخاطر چند تا خط کد، اسکریپتمون بخواد 30 مگ حافظه مموری رو اشغال کنه یعنی هر بار صدا کردن آرایه این مقدار در مموری افزایش پیدا میکنه اما اگه از yield برای همین مثال استفاده کنیم

نتیجه:

0.34MB
0.34MB
0.34MB
0.34MB

متوجه تفاوت فاحش این دو کد میشید اما این به این معنی نیست که از return به yield مهاجرت کنیم اما اگه از یه آرایه سنگین در کدتون استفاده می کنید گزینه مناسب همین yield خواهد بود


خصوصیات yield

من یه چندتا از خصوصیات yield رو اینجا براتون میگم(مهماش!)

آ. می تونید yield و return رو باهم استفاده کنید:

function getValues() {
    yield 'value';
    return 'return value';
}
$values = getValues();
foreach($values as $value) {}
echo $values->getReturn();// 'retrun value'

ب. برگرداندن به حالت key/value

function getValues() {
    yield 'key' => 'value';
}
$values = getValues();
foreach($values as $key => $value) {}

اطلاعات بیشتر در اینجا

نتیجه گیری

هدف این مقاله بیان تفاوت بین yield و retrun بود و زدن چند تا مثال برای درک بهتر yield

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


(ترکیبی از ترجمه یه مقاله و خودم)

لطفا در مورد اولین مطلب نظراتتون رو بدید و اگر عنوان یا مبحثی مد نظرتون پیشنهاد دهید

یا حق