تابع stream_bucket_prepend() در PHP
تابع stream_bucket_prepend() بخشی از API مربوط به «بکتها» (buckets) و «بریگید» (brigades) در سیستم فیلترهای استریم PHP است. این تابع به شما اجازه میدهد یک بکت (که حاوی دادههای بایت است) را در ابتدای یک بریگید قرار دهید تا هنگام پردازش فیلترها، آن دادهها در اولویت خواندن قرار بگیرد.
چرا این تابع مهم است؟
وقتی دارید فیلترهای سفارشی روی جریانها پیادهسازی میکنید، گاهی لازم است دادهای که تولید یا تبدیل کردهاید قبل از سایر بکتها ارسال شود — مثلا برای اضافه کردن سرآیند (header)، قرار دادن IV پیش از بدنهٔ رمزنگاری یا هنگام اعمال تغییراتی که ترتیب دادهها در صحت خروجی تأثیرگذار است. stream_bucket_prepend همین کار را انجام میدهد.
امضای تابع و مقدار بازگشتی
| امضا | توضیح |
|---|---|
bool stream_bucket_prepend(resource $brigade, resource $bucket) | یک بکت را در ابتدای بریگید قرار میدهد. مقدار true در صورت موفقیت، false در صورت خطا بازگردانده میشود. |
پارامترها
- $brigade: منبع (resource) نمایندهٔ بریگید خروجی در تابع فیلتر.
- $bucket: منبع نمایندهٔ بکتی که باید به ابتدای بریگید اضافه شود.
مثال پایه: یک فیلتر ساده که داده را قبل از دیگر بکتها قرار میدهد
data);
$consumed += $bucket->datalen;
// ساخت یک بکت جدید و قرار دادن آن در ابتدای بریگید خروجی
$newBucket = stream_bucket_new($this->stream, $data);
stream_bucket_prepend($out, $newBucket);
}
return PSFS_PASS_ON;
}
}
stream_filter_register("prepend.filter", "PrependFilter");
$fp = fopen("php://temp", "r+");
stream_filter_append($fp, "prepend.filter", STREAM_FILTER_WRITE);
fwrite($fp, "hellonworldn");
rewind($fp);
echo stream_get_contents($fp);
?>
توضیح: در این مثال یک فیلتر ساده تعریف شده که هر بکت ورودی را به حروف بزرگ تبدیل میکند، سپس با ساخت یک بکت جدید آن را با stream_bucket_prepend در ابتدای بریگید خروجی قرار میدهد. بدین ترتیب خروجی فیلتر حاوی بکتهای تبدیلشده در ترتیب مورد نظر خواهد بود.
بهینهسازی: استفاده از بکت قابل نوشتن به جای ساخت بکت جدید
data = strtoupper($bucket->data);
$consumed += $bucket->datalen;
// استفاده از همان بکت و قرار دادن آن در ابتدای بریگید خروجی
stream_bucket_prepend($out, $bucket);
}
return PSFS_PASS_ON;
}
}
?>
توضیح: این نسخه به جای ساخت بکت جدید، دادهٔ بکت را مستقیم تغییر میدهد و سپس همان بکت را prepend میکند. این روش حافظه کمتری مصرف میکند و از کپیبرداری غیرضروری جلوگیری میکند.
موارد کاربرد واقعی (Use Cases)
- اضافه کردن مقدمات یا head در پروتکلهای سفارشی پیش از ارسال دادهٔ اصلی.
- ترتیبدهی مجدد دادهها هنگام پیادهسازی فیلترهای رمزنگاری (مثلاً قرار دادن IV قبل از دیتا).
- ترکیب یا تقسیم فریمها برای پروتکلهای باینری که ترتیب دقیق بستهها اهمیت دارد.
- ایجاد فیلترهای وظیفهمند که باید نتایج خود را قبل از بکتهای دیگر در زنجیرهٔ خروجی قرار دهند.
نکات فنی و بهترین شیوهها
- stream_bucket_prepend صرفاً ترتیب را تغییر میدهد؛ اگر میخواهید بکتها را بدون تغییر ترتیب حفظ کنید از stream_bucket_append استفاده کنید.
- درون تابع filter معمولاً از stream_bucket_make_writeable برای دریافت بکت استفاده میشود؛ این تابع بکتی بازگشت میدهد که میتوانید دادهٔ آن را تغییر دهید.
- برای کاهش مصرف حافظه از تغییر مستقیم $bucket->data استفاده کنید تا از ساخت بکت اضافی اجتناب شود.
- همیشه مقدار بازگشتی تابع را چک کنید و در صورت نیاز خطاها را هندل کنید (مثلاً بررسی false بودن نتیجهٔ stream_bucket_prepend).
- در فیلترهایی که با دادهٔ حجیم کار میکنند، مراقب کپی دادهها و مصرف حافظه باشید و تا حد امکان اندازهٔ بکتها را کنترل کنید.
توابع مرتبط
- stream_bucket_new(): ساختن یک بکت جدید متصل به یک استریم.
- stream_bucket_make_writeable(): گرفتن بکتهای قابل نوشتن از بریگید ورودی.
- stream_bucket_append(): افزودن بکت در انتهای بریگید خروجی.
- stream_filter_register() و stream_filter_append(): ثبت و نصب فیلترها روی استریمها.
مسائل رایج و رفع خطا
- اگر stream_bucket_prepend مقدار false برگرداند، معمولاً به دلیل مقداردهی نادرست $brigade یا $bucket است. اطمینان حاصل کنید پارامترها منابع صحیح باشند.
- اگر ترتیب دادهها آنطور که انتظار دارید نیست، بررسی کنید آیا فیلترهای بعدی در همان زنجیره، بکتها را تغییر یا بازنویسی میکنند یا خیر.
خلاصه
stream_bucket_prepend ابزاری قدرتمند برای کنترل ترتیب خروجی در پیادهسازی فیلترهای استریم PHP است. با استفادهٔ صحیح از آن میتوانید سرآیندها، دادههای کنترلی یا نتایج پردازشی را پیش از سایر بکتها قرار دهید. بهترین عملکرد زمانی بهدست میآید که از هدفمندی در تغییر بکتها و مدیریت حافظه پیروی کنید.
آیا این مطلب برای شما مفید بود ؟




