7- php://temp
این استریم نیز رفتاری شبیه به php://memory دارد با این تفاوت که اگر حجم دادههای نوشتهشده از مقدار معینی بیشتر شود، به طور خودکار محتوا را در یک فایل موقت روی دیسک ذخیره میکند تا حافظه زیادی مصرف نشود (حد پیشفرض معمولاً ۲ مگابایت است).
مانند php://memory برای نگهداری موقت دادهها استفاده میشود، با این اطمینان که اگر داده خیلی بزرگ شد، به جای پر کردن RAM، به دیسک منتقل میشود.
این استریم برای مواردی مفید است که اندازهٔ داده از قبل مشخص نیست و ممکن است کوچک یا بسیار بزرگ باشد. شما میتوانید بدون نگرانی از مدیریت دستی حافظه/دیسک، به سادگی دادهها را در php://temp بنویسید.
$fp = fopen("php://temp", "r+");
fwrite($fp, "temp data");
rewind($fp);
echo fgets($fp); // temp data
fclose($fp);این کد رشته "temp data" را در استریم موقتی مینویسد و سپس با بازگشت به ابتدا، آن را میخواند و چاپ میکند. از آنجا که حجم این داده کم است، همه چیز در حافظه انجام میشود. اما اگر به جای یک رشتهٔ کوتاه، مثلاً چند مگابایت داده مینوشتیم، php://temp پس از عبور از آستانهٔ تعیینشده، به طور خودکار دادهها را در یک فایل موقت ذخیره میکرد.
این جزئیات برای برنامهنویس شفاف است و نیاز به تغییر کد نیست.
———
8- php://filter
این استریم امکان فیلتر کردن (پردازش) دادههای ورودی یا خروجی را در حین خواندن/نوشتن فراهم میکند. در واقع php://filter خودش منبع نهایی داده نیست، بلکه لایهای واسط است که میتوانید آن را قبل از یک منبع دیگر قرار دهید تا دادهها را طی عملیات خواندن یا نوشتن تغییر دهد.
به عنوان مثال میتوانید هنگام خواندن از یک فایل، تمام حروف را به بزرگ (uppercase) تبدیل کنید، یا هنگام نوشتن در یک فایل، دادهها را مثلاً به صورت Base64 کدگذاری کنید. این کار با تعریف فیلترهای موجود PHP مانند
string.toupper,
string.strip_tags,
convert.base64-encode
و غیره ممکن است.
$content = file_get_contents("php://filter/read=string.toupper/resource=input.txt");
echo $content;در این مثال، ما از استریم فیلتر استفاده کردهایم تا محتوای فایل input.txt را با فیلتر string.toupper (که همه حروف انگلیسی را به بزرگ تبدیل میکند) بخوانیم.
عبارت resource=input.txt در واقع به PHP میگوید منبع نهایی input.txt است اما قبل از تحویل داده، فیلتر string.toupper را بر دادههای خواندهشده اعمال کن.
نتیجهٔ این کد نمایش محتوای فایل به صورت حروف بزرگ است، بدون اینکه نیاز باشد پس از خواندن، خودمان تابعی برای بزرگکردن حروف صدا بزنیم. به همین شکل فیلترهای متنوعی برای حذف تگهای HTML، انکود/دیکود کردن Base64، فشردهسازی و... وجود دارد که میتوان در php://filter به کار گرفت.
توجه داشته باشید که نحوه نگارش میتواند برای نوشتن نیز باشد
مثلاً
php://filter/write=<filter>/resource=<...>
هنگام fwrite و حتی میتوان فیلترها را زنجیرهای اعمال کرد.
———
9- php://fd
این استریم امکان دسترسی مستقیم به یک توصیفگر فایل باز سیستمعامل (file descriptor) را فراهم میکند. در محیطهای یونیکس، هر فرایند مجموعهای شمارهگذاریشده از توصیفگرهای فایل دارد:
0 برای STDIN
1 برای STDOUT
2 برای STDERR
و اعداد بالاتر برای فایلها یا سوکتهای باز.
با استفاده از
php://fd/<number>
میتوان به توصیفگر مربوطه در PHP دسترسی گرفت.
این قابلیت نسبتاً خاص است و عمدتاً در اسکریپتهای CLI یا موارد خیلی پیشرفته استفاده میشود. برای مثال اگر PHP توسط یک فرایند دیگر با توصیفگرهای اضافی فراخوانی شود (مثلاً descriptor 3 به یک فایل خاص اشاره کند)، میتوان از php://fd/3 برای دسترسی به آن استفاده کرد. یا جهت تأیید، php://fd/1 اساساً خروجی استاندارد و معادل php://stdout است.
$fp = fopen("php://fd/1", "w");
fwrite($fp, "Test via FD 1\n");
fclose($fp);در اینجا با بازکردن php://fd/1، مستقیماً به خروجی استاندارد نوشتهایم؛ این کار همان اثر php://stdout را دارد.
در عمل شما ممکن است کمتر مستقیماً از php://fd استفاده کنید مگر در شرایط خاص، زیرا PHP معادلهای راحتتری برای STDIN/STDOUT/STDERR دارد. اما دانستن وجود آن برای موارد پیچیده (یا مثلاً تعامل با کتابخانههایی که descriptorها را مدیریت میکنند) خالی از لطف نیست.
در قسمت های بعدی با سایر استریمها در PHP آشنا خواهیم شد.
#PHP #PHP_streams
@AmirhDeveloper
.