Мир сегодня с "Юрий Подоляка"
Мир сегодня с "Юрий Подоляка"
Труха⚡️Україна
Труха⚡️Україна
Николаевский Ванёк
Николаевский Ванёк
Мир сегодня с "Юрий Подоляка"
Мир сегодня с "Юрий Подоляка"
Труха⚡️Україна
Труха⚡️Україна
Николаевский Ванёк
Николаевский Ванёк
| AmirHossein | avatar

| AmirHossein |

نوشته های یک برنامه نویس ناشی
🫂 @StartUnity
🫂 @startcoding0
TGlist reytingi
0
0
TuriOmmaviy
Tekshirish
Tekshirilmagan
Ishonchnoma
Shubhali
Joylashuv
TilBoshqa
Kanal yaratilgan sanaКвіт 23, 2023
TGlist-ga qo'shildi
Квіт 06, 2025
Muxrlangan guruh

"| AmirHossein |" guruhidagi so'nggi postlar

استریم‌ ها در PHP - قسمت نهم

- ساخت استریم رپر سفارشی


همانطور که در قسمت های قبل گفته شد، به صورت پیش‌فرض چندین Stream Wrapper داخلی وجود دارد.
با این حال، PHP این امکان را فراهم کرده است که پروتکل‌های سفارشی خود را به عنوان Stream Wrapper پیاده‌سازی کنیم تا توابع فایل‌سیستم روی منابع دلخواه ما عمل کنند​.

به عبارتی می‌توانیم یک Stream Wrapper سفارشی بسازیم و آن را با یک اسکیم (پروتکل) دلخواه (مثلاً myprot://) ثبت کنیم و سپس با توابع معمولی PHP مثل fopen() یا file_get_contents() به منابع سفارشی خود دسترسی داشته باشیم.

- مراحل ساخت Stream Wrapper سفارشی

ابتدا یک کلاس PHP تعریف می‌کنیم که متدهای لازم برای یک Stream Wrapper را پیاده‌سازی کند. این متدها شامل عملیات پایه‌ای مانند باز کردن، خواندن، نوشتن و ... روی منبع سفارشی هستند و با نام های خاص و از پیش تعیین شده پیاده سازی می شوند (در بخش بعد لیست کامل متدها توضیح داده خواهد شد).

نام کلاس می‌تواند دلخواه باشد (مثلاً MyStreamWrapper) و این کلاس نماینده‌ی پروتکل سفارشی ما خواهد بود که متدهای ما در آن تعریف می شوند.

پس از تعریف کلاس، باید آن را به PHP معرفی (ثبت) کنیم.
برای این کار از تابع stream_wrapper_register استفاده می‌شود.
پارامتر اول نام پروتکل (اسکیم) دلخواه ما به صورت رشته (مثلاً "myprot") و پارامتر دوم نام کلاس پیاده‌کننده‌ی آن پروتکل است.

اگر ثبت با موفقیت انجام شود، از این پس هر زمان که PHP با آدرسی به شکل myprot://... مواجه شود، به جای دسترسی مستقیم به فایل‌سیستم، متدهای کلاس ما را فراخوانی می‌کند. در صورت عدم موفقیت در ثبت (مثلاً اگر نام پروتکل تکراری باشد) این تابع مقدار false برمی‌گرداند.

پس از ثبت پروتکل سفارشی، می‌توانیم از آن دقیقاً مانند سایر پروتکل‌ها استفاده کنیم.
برای مثال، می‌توان با fopen("myprot://something", "r") یک منبع را باز کرد که منجر به اجرای متد stream_open (یکی از متدهای خاص و از پیشی تعیین شده) در کلاس ما می‌شود.

برای روشن‌تر شدن موضوع، یک مثال ساده در نظر بگیرید. فرض کنیم می‌خواهیم یک Stream Wrapper بنام var:// پیاده‌سازی کنیم که با آن بتوان داده‌ها را مستقیماً در یک متغیر PHP ذخیره و بازیابی کرد (نوعی استریم درون‌حافظه‌ای).
کلاس ما مثلاً VariableStream نام دارد و داده‌ها را در یک متغیر سراسری با نام مشخص ذخیره می‌کند:
class VariableStream {

نکته: برای خوانایی بهتر کد، پیشنهاد می‌شود آن را درون یک ادیتور باز کنید.

در مثال بالا، ابتدا پروتکل var:// به کلاس VariableStream نگاشت شده است.

سپس متغیری به نام $myvar تعریف شده و با fopen("var://myvar", "r+") یک استریم خواندن/نوشتن روی آن باز می‌کنیم. این عمل باعث فراخوانی stream_open در کلاس می شود.

با fwrite در واقع متد stream_write کلاس فراخوانی می‌شود و داده را در متغیر ذخیره می‌کند.

در پایان fclose($fp) استریم را می‌بندد (که منجر به stream_close در کلاس می‌شود، هرچند در این مثال ما این متد را پیاده‌سازی نکرده‌ایم).

در نهایت خروجی به صورت زیر خواهد بود:
string(12) "Hello
World
"


همانطور که مشاهده می‌کنید، با استفاده از Stream Wrapper سفارشی، توانستیم عملیات فایل‌گونه (خواندن/نوشتن) را روی یک متغیر ساده انجام دهیم، گویی که یک فایل است.

در قسمت های بعد، تمامی متدهایی که می‌توان در یک Stream Wrapper سفارشی پیاده‌سازی کرد را معرفی کرده و کاربرد هر کدام را توضیح می‌دهیم.

#PHP #PHP_streams
@AmirhDeveloper
.
استریم‌ ها در PHP - قسمت هشتم

- سایر استریم‌های ویژه

4- expect://

این استریم توسط افزونه PECL Expect فراهم می‌شود و به شما امکان تعامل با فرآیند‌های شبه‌تعاملی (مانند شبیه‌سازی رفتار ابزار expect در لینوکس) را می‌دهد.

با expect:// می‌توانید یک دستور سیستم‌عامل را اجرا کنید که منتظر ورودی کاربر است و سپس به صورت برنامه‌نویسی با آن تعامل کنید (ارسال ورودی‌ها و خواندن خروجی‌ها)، گویی که یک کاربر پشت ترمینال نشسته است.

مثلاً فرض کنید می‌خواهید از داخل PHP یک اسکریپت Python را اجرا کنید که در حین اجرا چند سوال yes/no از کاربر می‌پرسد. با expect:// می‌توانید PHP را طوری برنامه‌نویسی کنید که به آن سوالات پاسخ بفرستد و خروجی را دریافت کند.

این یک مورد پیشرفته است و بیشتر در محیط‌های خاص DevOps یا تست خودکار ابزارهای خط فرمان استفاده می‌شود.

$fp = fopen("expect://ftp", "w+");

در این مثال فرضی، ما برنامه ftp را با استریم expect باز کرده‌ایم. سپس چند فرمان را به آن ارسال کردیم (باز کردن اتصال، فرستادن نام‌کاربری و رمز). با fgets نیز خروجی برنامه ftp را خط‌به‌خط می‌خوانیم و چاپ می‌کنیم.

طبیعتاً در یک اسکریپت expect واقعی، شما منطق اضافه‌تری می‌نویسید تا تشخیص دهید چه زمانی ftp منتظر ورودی است (مثلاً عبارت "Password:" در خروجی ظاهر شد تا سپس رمز را ارسال کنید).

افزونه expect این امکانات تطبیق الگو را فراهم می‌کند. این توانمندی بسیار قدرتمند است اما محدود به مواقع خاص و نیازمند نصب extension است.

———

تا این قسمت با تمامی استریم های پیشفرض PHP آشنا شده ایم.

در قسمت بعد به ساخت استریم ها اختصاصی و شخصی سازی شده خواهیم پرداخت.


#PHP #PHP_streams
@AmirhDeveloper
.
استریم‌ ها در PHP - قسمت هفتم

- سایر استریم‌های ویژه

1- data://

این یک استریم رپر خاص است و به شما امکان می‌دهد داده‌های خام را به شکل یک URL داخلی در خود اسکریپت جاگذاری کنید.
با آن می‌توانید یک رشته داده (مثل متن یا حتی دادهٔ باینری به صورت Base64) را طوری استفاده کنید که گویی یک فایل است.

ساختار کلی آن به صورت
data://;base64,

یا
data://,

است.

موارد استفاده محدود ولی جالبی دارد؛ مثلاً برای تست و دمو می‌توانید به جای ایجاد یک فایل فیزیکی، محتوای آن را با data URI در خود کد قرار دهید. یا می‌توان از آن برای include کردن تکه کد PHP استفاده کرد.

به طور کلی، data:// زمانی به کار می‌آید که منبع داده شما از پیش در قالب یک رشته در دسترس است و می‌خواهید آن را مانند یک فایل رفتار دهید.

$quote = file_get_contents("data://text/plain;base64,SGVsbG8sIFdvcmxkIQ==");

در اینجا از data:// با MIME type برابر text/plain و داده‌های Base64 استفاده کرده‌ایم.
رشته Base64 داده‌شده SGVsbG8sIFdvcmxkIQ== در واقع متن "Hello, World!" را نمایندگی می‌کند. با file_get_contents این منبع data URI را خواندیم و در خروجی چاپ کردیم؛ لذا نتیجه Hello, World! نمایش داده می‌شود.

همانطور که گفت شد، می توان یک کد PHP را به شکل Base64 تبدیل کرد، و آن را include کنیم.
include "data://text/plain;base64,PD9waHAgaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQvcGxhaW4nKTtlY2hvICdIZWxsbyBXb3JsZCc7Pz4=";


لبته استفاده از data:// برای include مستلزم فعال بودن allow_url_include است و به لحاظ امنیتی همیشه توصیه نمی‌شود، اما وجود چنین امکانی بیانگر انعطاف بالای استریم‌ها در PHP است.

———
2- ssh2.xxx://

این استریم‌ها مربوط به دسترسی از طریق پروتکل Secure Shell (SSH2) هستند و در صورتی در دسترس‌اند که اکستنشن SSH2 بر روی PHP نصب باشد.

با ssh2.sftp:// می‌توان به سیستم فایل روی یک سرور از طریق SFTP دسترسی داشت،و با ssh2.scp:// امکان کپی فایل به/از سرور از طریق SCP فراهم است.
همچنین ssh2.shell:// و ssh2.exec:// و ssh2.tunnel:// برای مقاصد مختلفی مثل اجرای دستورات روی سرور راه دور، ایجاد تونل SSH و غیره وجود دارند.

اگر نیاز به تعامل با فایل‌ها یا اجرای دستورات روی یک سرور دیگر از طریق SSH دارید، این استریم‌ها کار را ساده می‌کنند. به عنوان مثال، برای خواندن یک فایل روی سرور B از اسکریپت PHP که روی سرور A اجرا می‌شود، می‌توان از
ssh2.sftp://user:pass@host:22/path/to/file

استفاده کرد.

$fp = fopen("ssh2.sftp://user:password@remote-server.com:22/home/user/remote.txt", "r");

در این مثال فرضی، یک اتصال SFTP به سرور remote-server.com با نام‌کاربری و رمز داده‌شده برقرار می‌شود و فایل remote.txt خوانده می‌شود.

استفاده از این رپرها به شما امکان می‌دهد بدون نیاز به ابزار خارجی یا کتابخانهٔ اضافه، مستقیماً از توابع استریم PHP (مانند fopen و غیره) برای تعامل با SSH/SFTP بهره ببرید.

طبیعتاً برای اینکه این کار عمل کند باید افزونه SSH2 نصب و فعال باشد و اعتبارنامه‌های ورود صحیح باشند. در غیر این صورت، PHP این آدرس را نخواهد شناخت.

———
3- ogg://

این استریم رپر برای کار با داده‌های رسانه‌ای فرمت Ogg طراحی شده است. Ogg یک قالب کانتینر چندرسانه‌ای (معمولاً صوتی) است. پشتیبانی از ogg:// در PHP مستلزم نصب بودن کتابخانه/افزونهٔ مربوط به فرمت Ogg می‌باشد.

در عمل این مورد بسیار کمتر استفاده شده است، اما تصور کنید می‌خواهید جریان صوتی یک فایل OGG را پردازش یا پخش کنید. با ogg:// می‌توانید مستقیماً محتوا را خوانده و احتمالاً با فیلترهای مناسب decode کنید. به طور خلاصه، این رپر برای خواندن دادهٔ خام از درون فایل‌های .ogg (مثلاً استخراج جریان‌های صوتی) به کار می‌رود و برای اکثر توسعه‌دهندگان PHP کاربرد روزمره‌ای ندارد مگر در پروژه‌های خاص مالتی‌مدیا.

استفاده از ogg:// به طور مستقیم شاید ساده نباشد زیرا نیاز به دانستن ساختار درونی Ogg و به‌کارگیری فیلتر یا کتابخانه جهت تفسیر داده‌ها دارد. اما در سطح استریم، مثال کلی می‌تواند به شکل زیر باشد:
$fp = fopen("ogg://song.ogg", "r");

در اینجا $fp حاوی استریم رمزگذاری‌شده صوتی خواهد بود و برای تبدیل به صدای قابل پخش باید از توابع decode صوت (یا انتقال آن به پلیر مناسب) استفاده کرد.

در قسمت های بعدی با سایر استریم‌ها در PHP آشنا خواهیم شد.

#PHP #PHP_streams
@AmirhDeveloper
.
استریم‌ ها در PHP - قسمت ششم

- استریم‌های فشرده‌سازی و آرشیو

3- zip://

این استریم رپر اجازه می‌دهد محتویات یک فایل ZIP را مانند یک سیستم فایل مجزا مشاهده و دستکاری کنید. با آن می‌توانید فایل‌های درون یک آرشیو ZIP را بخوانید بدون آنکه نیاز باشد کل آرشیو را دستی از حالت فشرده خارج کنید. برای اشاره به یک فایل داخل ZIP، از علامت # در مسیر استفاده می‌شود.

فرض کنید یک آرشیو zip حاوی چند فایل CSV دارید و می‌خواهید یکی از آنها را مستقیماً پردازش کنید؛ با zip:// می‌توانید مستقیماً آن فایل CSV را باز کنید. یا برای لیست کردن محتویات آرشیو می‌توانید مانند یک دایرکتوری عمل کنید.

توجه داشته باشید که این قابلیت نیازمند فعال بودن اکستنشن Zip در PHP است.

$content = file_get_contents("zip://". __DIR__ . "/archive.zip#readme.txt");

در اینجا با استفاده از file_get_contents به مسیر zip://.../archive.zip#readme.txt دسترسی پیدا کرده‌ایم. بخش قبل از # مسیر آرشیو ZIP روی دیسک را مشخص می‌کند و بعد از # نام فایلی داخل آن آرشیو را.

آرشیو را باز کرده، به فایل readme.txt درون آن دسترسی پیدا می‌کند و محتوایش را برمی‌گرداند. به همین ترتیب می‌توان هر فایلی را داخل ZIP با fopen یا حتی include (برای فایل‌های PHP داخل phar/zip) باز کرد.

این رپر فقط خواندن را پشتیبانی می‌کند؛ برای نوشتن به ZIP باید از کلاس‌های شیءگرای ZipArchive استفاده کنید.

———
4- phar://

‏Phar مخفف "PHP Archive" است و یک قالب آرشیو مخصوص PHP (معمولاً با پسوند .phar) می‌باشد که می‌تواند شامل فایل‌های PHP، کتابخانه‌ها و سایر منابع باشد. استریم phar:// اجازه می‌دهد فایل‌های داخل یک آرشیو Phar را همانند Zip به صورت شفاف بخوانید و حتی اجرا (include/require) کنید.
این قابلیت به توزیع و استفاده از برنامه‌ها یا کتابخانه‌های PHP در قالب یک فایل واحد کمک می‌کند.

برای مثال، Composer خودش به صورت یک فایل phar توزیع می‌شود که شما می‌توانید آن را با PHP اجرا کنید. با phar:// می‌توانید به محتویات آن دسترسی داشته باشید.

همچنین از این طریق می‌توان کد PHP را مستقیماً از Phar include کرد. نوشتن در Phar نیز ممکن است (Pharها می‌توانند در حالت قابل نوشتن باز شوند) اما معمولاً Pharها به صورت فقط خواندنی در برنامه‌ها استفاده می‌شوند.

require "phar://package.phar/lib/functions.php";

در این مثال، فایل lib/functions.php واقع در داخل آرشیو package.phar مستقیماً بارگذاری (require) شده است. یعنی حتی بدون اینکه آن را از آرشیو روی دیسک استخراج کنیم، PHP قادر است محتویاتش را تفسیر و اجرا کند.

از دید برنامه‌نویسی، این کار تفاوتی با require کردن یک فایل عادی ندارد، جز اینکه داریم از یک بستهٔ Phar می‌خوانیم. اگر بخواهیم محتوای غیر PHP (مثلاً یک فایل متنی) را از Phar بخوانیم، می‌توانیم از file_get_contents("phar://...") یا روش‌های مشابه استفاده کنیم.

———
5- rar://

این استریم رپر عملکردی مشابه zip:// دارد اما برای فرمت آرشیو RAR استفاده می‌شود. فایل‌های RAR به صورت پیش‌فرض توسط PHP پشتیبانی نمی‌شوند مگر اینکه اکستنشن RAR فعال شده باشد.

$fp = fopen("rar://files.rar#doc.txt", "r");

این کد فرضی نشان می‌دهد که چگونه می‌توان از rar:// استفاده کرد. مانند Zip، پس از علامت # نام فایل درون آرشیو را مشخص می‌کنیم. با fopen و خواندن محتوا، PHP آرشیو را باز کرده و داده‌های فایل doc.txt را به ما می‌دهد.

از آنجا که پشتیبانی RAR به صورت پیش‌فرض موجود نیست، هنگام استفاده در محیط عملی باید اطمینان حاصل کنید که افزونه PECL RAR نصب و فعال شده باشد.

در قسمت های بعدی با سایر استریم‌ها در PHP آشنا خواهیم شد.

#PHP #PHP_streams
@AmirhDeveloper
.
دوستان دو مورد رو بگم بهتون

یک اینکه، دوره لاراول رو یه وقفه طولانی انداختم.
حقیقتا بعد ۵ فصل مخصوصا فصل های مربوط به دیتابیس خیلی خسته شدم و یه استراحتی کردم😂
الان مجدد دارم می‌نویسم، و به زودی مثل قبل هر روز یک پست میذارم ازش.

دوم اینکه، من معمولا همه دوره هارو خودم می‌نویسم، ولی این دوره PHP Streams به صورت خاص با Chat GPT و حالت Deep Research نوشته شده.
هدف من تست این قابلیت GPT بود، ولی خیلی کامل و جامع توضیح داد، منم یه سری تغییرات ریز دادم و به صورت پست به اشتراک میذارمش.

سوم اینکه، از محتوا هم یک حمایتی بکنید بیشتر دیده بشه، و ممنون از دوستانی که حمایت کردن❤️
استریم‌ ها در PHP - قسمت چهارم

استریم‌های سیستم فایل (File Streams)

1- file://

این استریم امکان دسترسی به سیستم فایل محلی سرور را فراهم می‌کند. file:// در PHP پیش‌فرض‌ترین استریم است؛ یعنی حتی اگر هیچ پروتکلی قبل از مسیر فایل ننویسید و مستقیم مسیری را بدهید، در واقع از همین پروتکل فایل استفاده می‌شود.

با file:// می‌توانید فایل‌های روی دیسک محلی را بخوانید، بنویسید، ایجاد کنید یا تغییر نام دهید – درست مانند کاری که با توابع معمول فایل انجام می‌دهید.

خواندن و نوشتن فایل‌های معمولی. مثلاً خواندن محتوای یک فایل متنی جهت نمایش در صفحه، نوشتن لاگ در یک فایل .log، ایجاد یک فایل پیکربندی و ... . از آنجا که این پروتکل به منابع محلی دسترسی دارد، امنیت آن وابسته به دسترسی‌های فایل‌سیستم است (PHP فقط می‌تواند فایل‌هایی را بخواند/بنویسد که مجوزش را دارد).

$data = file_get_contents("file://example.txt");

در این مثال، تابع file_get_contents را با مسیر file://... صدا زده‌ایم تا محتوای فایل example.txtخوانده شود.

استفاده از file:// در اینجا اختیاری است؛ زیرا اگر به جای آن مستقیماً مسیر فایل را می‌نوشتیم (مثلاً "example.txt")، PHP به صورت خودکار از استریم فایل استفاده می‌کرد.

توجه داشته باشید برای اشاره به مسیرهای مطلق در سیستم‌عامل ویندوز، سه اسلش بعد از file: لازم است .
مثال:
file:///C:/path/to/file.txt


———
2- glob://

این استریم رپر امکان استفاده از الگوهای glob را به شکل یک منبع داده فراهم می‌کند. به طور معمول، تابع glob() در PHP رشته‌های مسیر را بر اساس الگو (pattern) تطبیق داده و لیستی از نام فایل‌ها را برمی‌گرداند. glob:// این قابلیت را در قالب یک استریم پیاده‌سازی می‌کند که می‌توان آن را مانند یک دایرکتوری مجازی پیمایش کرد.

زمانی که بخواهید با استفاده از یک الگوی خاص، مجموعه‌ای از فایل‌ها یا مسیرها را پردازش کنید. مثلاً پیدا کردن همه فایل‌های .log در یک پوشه و خواندن تک‌تک آن‌ها. با این استریم می‌توانید این کار را بدون صدا زدن تابع جداگانه glob و سپس حلقه روی نتایج، انجام دهید – مستقیماً به عنوان یک پوشه با محتوای فیلترشده باز می‌کنید.

if ($dir = opendir("glob://*.txt")) {

در این قطعه کد، از opendir با مسیر glob://*.txt استفاده کرده‌ایم. نتیجهٔ این opendir مثل این است که یک دایرکتوری باز کرده باشیم که فقط شامل فایل‌هایی است که با الگوی *.txt تطابق دارند. سپس با readdir در یک حلقه، تک‌تک نام این فایل‌ها را می‌خوانیم و چاپ می‌کنیم. در نهایت closedir را فراخوانی می‌کنیم.

استفاده از glob:// می‌تواند کدنویسی را در شرایطی که می‌خواهید روی مجموعه‌ای از فایل‌های منطبق با الگو کار کنید ساده‌تر کند.

در قسمت های بعدی با سایر استریم‌ها در PHP آشنا خواهیم شد.

#PHP #PHP_streams
@AmirhDeveloper
.
استریم‌ ها در PHP - قسمت سوم

7- php://temp

این استریم نیز رفتاری شبیه به php://memory دارد با این تفاوت که اگر حجم داده‌های نوشته‌شده از مقدار معینی بیشتر شود، به طور خودکار محتوا را در یک فایل موقت روی دیسک ذخیره می‌کند تا حافظه زیادی مصرف نشود (حد پیش‌فرض معمولاً ۲ مگابایت است).

مانند php://memory برای نگهداری موقت داده‌ها استفاده می‌شود، با این اطمینان که اگر داده خیلی بزرگ شد، به جای پر کردن RAM، به دیسک منتقل می‌شود.

این استریم برای مواردی مفید است که اندازهٔ داده از قبل مشخص نیست و ممکن است کوچک یا بسیار بزرگ باشد. شما می‌توانید بدون نگرانی از مدیریت دستی حافظه/دیسک، به سادگی داده‌ها را در php://temp بنویسید.

$fp = fopen("php://temp", "r+");

این کد رشته "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");

در این مثال، ما از استریم فیلتر استفاده کرده‌ایم تا محتوای فایل input.txt را با فیلتر string.toupper (که همه حروف انگلیسی را به بزرگ تبدیل می‌کند) بخوانیم.

عبارت resource=input.txt در واقع به PHP می‌گوید منبع نهایی input.txt است اما قبل از تحویل داده، فیلتر string.toupper را بر داده‌های خوانده‌شده اعمال کن.

نتیجهٔ این کد نمایش محتوای فایل به صورت حروف بزرگ است، بدون اینکه نیاز باشد پس از خواندن، خودمان تابعی برای بزرگ‌کردن حروف صدا بزنیم. به همین شکل فیلترهای متنوعی برای حذف تگ‌های HTML، انکود/دیکود کردن Base64، فشرده‌سازی و... وجود دارد که می‌توان در php://filter به کار گرفت.

توجه داشته باشید که نحوه نگارش می‌تواند برای نوشتن نیز باشد
مثلاً
php://filter/write=/resource=<...>
هنگام fwrite و حتی می‌توان فیلترها را زنجیره‌ای اعمال کرد.

———
9- php://fd

این استریم امکان دسترسی مستقیم به یک توصیف‌گر فایل باز سیستم‌عامل (file descriptor) را فراهم می‌کند. در محیط‌های یونیکس، هر فرایند مجموعه‌ای شماره‌گذاری‌شده از توصیف‌گرهای فایل دارد:
0 برای STDIN
1 برای STDOUT
2 برای STDERR
و اعداد بالاتر برای فایل‌ها یا سوکت‌های باز.

با استفاده از
php://fd/
می‌توان به توصیف‌گر مربوطه در PHP دسترسی گرفت.

این قابلیت نسبتاً خاص است و عمدتاً در اسکریپت‌های CLI یا موارد خیلی پیشرفته استفاده می‌شود. برای مثال اگر PHP توسط یک فرایند دیگر با توصیف‌گرهای اضافی فراخوانی شود (مثلاً descriptor 3 به یک فایل خاص اشاره کند)، می‌توان از php://fd/3 برای دسترسی به آن استفاده کرد. یا جهت تأیید، php://fd/1 اساساً خروجی استاندارد و معادل php://stdout است.

$fp = fopen("php://fd/1", "w");

در اینجا با بازکردن php://fd/1، مستقیماً به خروجی استاندارد نوشته‌ایم؛ این کار همان اثر php://stdout را دارد.

در عمل شما ممکن است کمتر مستقیماً از php://fd استفاده کنید مگر در شرایط خاص، زیرا PHP معادل‌های راحت‌تری برای STDIN/STDOUT/STDERR دارد. اما دانستن وجود آن برای موارد پیچیده (یا مثلاً تعامل با کتابخانه‌هایی که descriptorها را مدیریت می‌کنند) خالی از لطف نیست.

در قسمت های بعدی با سایر استریم‌ها در PHP آشنا خواهیم شد.


#PHP #PHP_streams
@AmirhDeveloper
.
استریم‌ ها در PHP - قسمت دوم

3- php://stdin

این استریم نمایانگر ورودی استاندارد (STDIN) فرایند PHP است. در محیط خط فرمان (CLI)، php://stdin همان داده‌ای است که از کاربر یا از ورودی pipeline دریافت می‌شود.

در اسکریپت‌های PHP CLI که نیاز به خواندن ورودی کاربر از کنسول یا داده‌های piped از فرمان دیگر دارند، می‌توان این استریم را به کار برد. به عنوان مثال، برنامه‌ای که منتظر می‌ماند کاربر در ترمینال متنی وارد کند یا نتیجه اجرای یک دستور دیگر را از طریق pipe دریافت کند.

$fp = fopen("php://stdin", "r");

این اسکریپت ابتدا پیغام درخواست ورودی را در کنسول نمایش می‌دهد. سپس با fopen استریم را باز کرده و با fgets یک خط از آن می‌خواند (منتظر می‌ماند تا کاربر یک خط متن وارد کرده و Enter بزند). در نهایت همان خط را مجدداً در خروجی نمایش می‌دهد.

این استریم فقط خواندنی است و مخصوص محیط‌های تعاملی یا ورودی‌های خط فرمان می‌باشد (در حالت اجرای وب معمولاً کاربردی ندارد).
———
4- php://stdout

این استریم معادل خروجی استاندارد (STDOUT) در PHP است. در حالت CLI، هر چیزی که به php://stdout نوشته شود در کنسول به نمایش در می‌آید (مشابه عملکرد echo).

بیشتر در اسکریپت‌های خط فرمان کاربرد دارد، زمانی که بخواهید به صورت صریح به STDOUT بنویسید. هرچند در عمل استفاده مستقیم از php://stdout تفاوتی با php://output (در حالت CLI) ندارد، اما ممکن است برای شفاف‌سازی منظور یا برای کدنویسی سیستم‌هایی که مستقیماً با توصیف‌گرهای STDOUT کار می‌کنند، استفاده شود.

$fp = fopen("php://stdout", "w");

اجرای این کد در محیط خط فرمان، متن "Test message on STDOUT" را در خروجی ترمینال نمایش می‌دهد. این همان خروجی استاندارد برنامه است.

توجه کنید که در محیط وب (مثلاً اجرای PHP از طریق Apache یا Nginx)، STDOUT همان خروجی HTML ارسالی به مرورگر است، لذا php://stdout در آن context معادل php://output عمل می‌کند.
———
5- php://stderr

این استریم متناظر با خروجی خطا (STDERR) در PHP است. STDOUT و STDERR هر دو خروجی هستند اما به طور مجزا مدیریت می‌شوند؛ معمولاً STDOUT برای خروجی معمول برنامه و STDERR برای پیام‌های خطا یا لاگ خطاها استفاده می‌شود.

در اسکریپت‌های CLI یا محیط‌هایی که می‌خواهید پیام‌های خطا را جدا از خروجی معمول ارسال کنید. برای مثال، می‌توانید لاگ خطا یا هشدارها را به این استریم بنویسید تا در کنسول یا لاگ سرور به عنوان خطا ثبت شوند، بدون اینکه جریان عادی خروجی (STDOUT) را مختل کنند.

$fp = fopen("php://stderr", "w");

این قطعه کد در محیط خط فرمان، متن خطا را به STDERR می‌فرستد. در نتیجه اگر برنامه را اجرا کنید، پیغام "Err: Not found!" به عنوان خروجی خطا ثبت می‌شود (در ترمینال معمولاً با رنگ قرمز یا در جریان مجزا نمایش داده می‌شود).

در حالت وب، محتوایی که به آن نوشته شود توسط وب‌سرور ممکن است در لاگ خطای سرور ثبت گردد.
———
6- php://memory

این استریم یک فضای حافظه موقتی در RAM ایجاد می‌کند که می‌توان مانند یک فایل با آن رفتار کرد. تمام داده‌هایی که در php://memory نوشته می‌شوند، در حافظه RAM ذخیره می‌شوند. هنگامی که نیاز دارید یک رشته یا داده حجیم را موقتاً مانند یک فایل مدیریت کنید اما نمی‌خواهید روی دیسک نوشته شود.

برای مثال تولید محتوای پویا (مثل ایجاد یک فایل CSV در حافظه و سپس ارائه آن برای دانلود) یا جمع‌آوری خروجی‌های متعدد و سپس پردازش یا ارسال آن. مزیت استفاده از حافظه این است که عملیات سریع‌تر است (عدم نیاز به دیسک) البته به میزان حافظهٔ قابل دسترس PHP محدود است.

$fp = fopen("php://memory", "r+");

در این مثال، ابتدا یک استریم حافظه باز می‌کنیم (r+ به معنی خواندن/نوشتن). سپس دو رشته "Foo" و "Bar" در آن نوشته می‌شود. با rewind مکان فایل را به ابتدای حافظه برمی‌گردانیم و با stream_get_contents کل محتوا را می‌خوانیم؛ حاصل رشتهٔ "FooBar" است که نشان می‌دهد داده‌ها با موفقیت در حافظه جمع‌آوری شده‌اند.

تمام این عملیات بدون نوشتن حتی یک بایت روی دیسک انجام شده است.

در قسمت های بعدی با سایر استریم‌ها در PHP آشنا خواهیم شد.

#PHP #PHP_streams
@AmirhDeveloper
.
استریم‌ ها در PHP - قسمت اول

در PHP، استریم (Stream) یک سازوکار انتزاعی برای مدیریت ورودی و خروجی داده‌ها است. به زبان ساده، استریم‌ها به شما امکان می‌دهند انواع مختلف منابع داده (مانند فایل‌های سیستم، درخواست‌های شبکه، داده‌های فشرده و ...) را از طریق یک رابط یکسان بخوانید یا بنویسید.

به جای آنکه برای هر نوع منبع تابع‌ها یا روش‌های جداگانه‌ای داشته باشید، PHP با استفاده از استریم‌ها یک مجموعه توابع عمومی (مثل fopen, fread, fwrite و ...) فراهم کرده که با همه این منابع به شکل یکنواخت رفتار می‌کنند.

هر استریم رَپر (Stream Wrapper) در PHP در واقع یک پروتکل یا طرح (scheme) خاص را پیاده‌سازی می‌کند که به صورت scheme:// استفاده می‌شود. برای مثال، file:// برای دسترسی به سیستم فایل محلی، http:// برای منابع وب، یا php:// برای منابع داخلی PHP استفاده می‌شود.

‏PHP به طور پیش‌فرض تعداد زیادی استریم رپر داخلی دارد که بسیاری از کارهای معمول را پوشش می‌دهند. شما می‌توانید توسط این استریم‌ها به سادگی کارهایی مثل خواندن فایل‌ها، دریافت داده از وب, نوشتن خروجی، خواندن ورودی خام درخواست‌ها و حتی کار با داده‌های فشرده‌شده را انجام دهید، بدون اینکه نگران جزئیات سطح پایین هر کدام باشید.

استریم‌های داخلی PHP - ‏php://

1- php://input

این استریم برای دسترسی به دادهٔ ورودی خام HTTP در PHP استفاده می‌شود. به طور خاص، این استریم محتوای خام بدنهٔ درخواست HTTP را (معمولاً در درخواست‌های POST یا PUT) ارائه می‌کند، بدون هیچ‌گونه پردازش یا parse خودکار.

زمانی که نیاز دارید ورودی خام درخواست را بخوانید (مثلاً دریافت داده‌های JSON از یک API کلاینت یا پردازش درخواست‌های RESTful)، این استریم بسیار مفید است. برخلاف متغیرهای سراسری مانند $_POST که فقط داده‌های form-urlencoded را می‌گیرند،
این استریم اجازه می‌دهد انواع داده‌ها (JSON, XML, متن خام و ...) را مستقیماً از بدنهٔ درخواست دریافت کنید.

$json = file_get_contents("php://input");

در این مثال، محتوای خام ورودی HTTP با file_get_contents از php://input خوانده شده و سپس از JSON به آرایه PHP تبدیل می‌گردد.
در نهایت نام کاربر خروجی گرفته می‌شود. اگر درخواست فوق رشتهٔ JSON
{"user": "Ali"}

را ارسال کرده باشد، خروجی برنامه Hello Ali خواهد بود.

توجه داشته باشید php://input فقط خواندنی است و فقط یک بار می‌توان محتوا را از آن خواند، یعنی پس از خواندن، محتوای آن خالی می‌شود. همچنین در مورد درخواست‌های معمولی فرم (مانند multipart/form-data برای آپلود فایل)، استفاده از این استریم توصیه نمی‌شود، زیرا PHP آن داده‌ها را قبلاً پردازش کرده است.

2- php://output

این استریم خروجی استاندارد اسکریپت PHP را نمایندگی می‌کند. هر داده‌ای که در آن نوشته شود، مستقیماً به خروجی معمول برنامه (همان چیزی که مرورگر دریافت می‌کند یا در CLI ترمینال نشان داده می‌شود) فرستاده می‌شود.
زمانی که بخواهید با توابع استریم داده‌ای را به خروجی بفرستید (به جای استفاده از echo یا print)، می‌توانید php://output را مانند یک فایل باز کرده و در آن بنویسید.

این قابلیت می‌تواند در سناریوهایی مفید باشد که یک تابع انتظار یک منبع استریم برای خروجی دارد یا هنگامی که می‌خواهید خروجی را از سایر عملیات جدا کنید.

$fp = fopen("php://output", "w");

در این قطعه کد، ما استریم خروجی را باز کرده‌ایم و یک خط متن را با fwrite در آن نوشتیم. نتیجهٔ اجرای این کد نمایش متن ذکر شده در خروجی (مثلاً مرورگر یا کنسول) است. در واقع کاری که fwrite در اینجا انجام می‌دهد معادل همان echo کردن رشته‌ها است.

در قسمت های بعدی با سایر استریم‌ها در PHP آشنا خواهیم شد.

#PHP #PHP_streams
@AmirhDeveloper
.
یه مجموعه پست از PHP Streams هم نوشتم و در کنار پست های لاراول ارسال می‌کنم.
فصل شش - Requests and Response

بخش دوم - اعتبارسنجی درخواست ها


اعتبارسنجی ها عمدتا به 3 روش انجام می شوند. در این پست به 2 روش آن اشاره می شود و روش سوم در پست های بعدی کامل بررسی خواهد شد.

یکی از روش های مرسوم اعتبارسنجی بر روی درخواست ها (ورودی ها POST، GET و...) فراخوانی متد validate از متغیر $request می باشد.
public function store(Request $request)


کد بالا درخواست ما را اعتبارسنجی می کند، به عنوان مثال، مقدار input با نام title باید required، unique و طول حداکثر 255 کاراکتر داشته باشد.
اگر همه این ویژگی ها را داشته باشد اعتبارسنجی درخواست موفقیت آمیز بوده، در غیر اینصورت یک آرایه از error ها ایجاد می شود.

روش دیگر اعتبارسنجی استفاده از فساد Validator است:
$validator = Validator::make($request->all(), [


کد بالا همانند روش اول است، با این تفاوت که می توان اعتبارسنجی را روی داده های دلخواه (پارامتر اول متد make که برابر تمامی ورودی های درخواست قرار کرفته) انجام داد.

هر دو روش مرسوم و پرکاربرد هستند که بسته به نیاز استفاده می شوند.

پس از انجام اعتبار سنجی یک شئ از Validator باز می گردد که متدهایی در اختیار ما می گذارد، در ادامه به بررسی آنها خواهیم پرداخت.

1- متد fails
این متد بررسی می‌کند که آیا عملیات اعتبارسنجی شکست خورده یا نه.
if ($validator->fails()) {


2- متد validated
اگر اعتبارسنجی موفقیت‌آمیز باشد، این متد فقط داده‌های معتبر (validated) را بازمی‌گرداند. این روش، داده‌های تاییدشده را فیلتر می‌کند.
$validated = $validator->validated();


3- متد stopOnFirstFailure
اگر بخواهید عملیات اعتبارسنجی به‌محض اولین خطا متوقف شود، از این متد استفاده می‌کنید.
$validator = Validator::make($request->all(), [


4- متد validate
مقدار اعتبارسنجی‌شده را باز می‌گرداند یا اگر خطایی وجود داشته باشد، به‌صورت خودکار ValidationException پرتاب می‌کند. معمولاً در کنترلر استفاده می‌شود.
$validated = $request->validate([

در این حالت اگر فیلدی نامعتبر باشد، لاراول به‌صورت خودکار به صفحه قبل برمی‌گردد و خطاها را نمایش می‌دهد.

5- متد validateWithBag
مشابه validate() است ولی خطاها را داخل یک Error Bag خاص ذخیره می‌کند. برای مثال وقتی چند فرم در یک صفحه داریم و هرکدام باید خطاهای جداگانه داشته باشند.
$request->validateWithBag('updateProfile', [

درصورت بروز خطا، ارورها در یک Bag با نام updateProfile ذخیره می شوند.

6- متد after
پس از اجرای تمام قوانین اعتبارسنجی، می‌توانید با این متد، اعتبارسنجی‌های سفارشی اضافه کنید.
$validator->after(function ($validator) use ($request) {


7- متد errors
لیست خطاهای اعتبارسنجی را باز می‌گرداند، معمولاً در ترکیب با fails() استفاده می‌شود.
$errors = $validator->errors();


8- متد sometimes
اجرا شدن قوانین اعتبارسنجی را وابسته به شرط خاصی می‌کند.

در این مثال، اگر مقدار subscribe برابر با true باشد، فیلد email اجباری خواهد شد.

متد های دیگری نیز وجود دارد که شامل آموزش نخواهد شد.

درصوتی که یک اعتبارسنجی ناموفق باشد، خطا ها در متغیر $errors در سمت Blade در دسترس خواهد گرفت.
به عنوان مثال:
@if ($errors->any())

کد بالا درصورت وجود خطا اعتبارسنجی، خطا آنها را به کاربر نمایش می دهد.

همچنین می توان از دایرکتیو @error استفاده کنید:
@error('title')

این کد در صورتی که اینپوت title با خطا مواجه شود، متن خطای آن را به کاربر نمایش می دهد.

اگر نیاز به خطا ها از یک Bag خاص داشتید می توانید پارامتر دوم را نیز کامل کنید:
@error('title', 'myBag')


تا این بخش با روش اعتبارسنجی درخواست ها و نمایش خطاهای آن آشنا شدید، در قسمت های بعدی با Ruleهای اعتبارسنجی (required|unique|...) آشنا خواهیم شد.

#laravel #لاراول #فصل_۶
@AmirhDeveloper
.
تعطیلات هم تموم شد، ایشالا از فردا ادامه دوره لاراول رو شروع می‌کنیم.

یکم حمایت هم بکنید از کانال، از ۸۰۰ تا شدیم ۶۰۰ تا. 🤝❤️
دیگه LaraGram داره از کنترل خارج میشه
سال نوی همه مبارک
سال خوب و پربرکتی در کنار خانواده و دوستانتون داشته باشید❤️🔥
فصل شش - Requests and Response

بخش دوم - اعتبارسنجی درخواست ها


لاراول یک سیستم اعتبارسنجی قدرتمند و انعطاف‌پذیر ارائه می‌دهد که به شما امکان می‌دهد داده‌ها را به راحتی بررسی کرده و از ورود اطلاعات نامعتبر جلوگیری کنید.

اعتبارسنجی می‌تواند به روش‌های مختلفی انجام شود:

1- استفاده از متد validate در کنترلر
$request->validate([


این روش برای اعتبارسنجی ساده استفاده می‌شود. اگر داده‌ها نامعتبر باشند، لاراول به‌صورت خودکار یک پاسخ خطا ارسال می‌کند.

2- استفاده از کلاس‌های درخواست سفارشی (Form Request Validation)
برای پروژه‌های بزرگ، بهتر است قوانین اعتبارسنجی را در یک کلاس مجزا تعریف کنید:
php artisan make:request RegisterRequest


سپس در کلاس ایجاد شده، قوانین را در متد rules مشخص کنید.
public function rules(): array


ایجاد قوانین سفارشی (Custom Rules)

علاوه بر قوانین پیش‌فرض لاراول، می‌توان قوانین سفارشی نیز ایجاد کرد. این ویژگی زمانی مفید است که نیاز به اعتبارسنجی خاصی داشته باشید که در قوانین پیش‌فرض موجود نیست.
php artisan make:rule ValidUsername


در کلاس ValidUsername می‌توان منطق اعتبارسنجی را تعریف و در پروژه استفاده کرد.
public function validate(string $attribute, mixed $value, Closure $fail): void


سفارشی‌سازی پیام‌های خطا

لاراول به شما اجازه می‌دهد تا پیام‌های خطای اعتبارسنجی را شخصی‌سازی کنید:
$messages = [


این ویژگی برای چندزبانه کردن پیام‌های خطا نیز بسیار مفید است.

سیستم اعتبارسنجی در لاراول بسیار قدرتمند، انعطاف‌پذیر و ساده است. با استفاده از روش‌های مختلف مانند Form Request Validation، Custom Rules و شخصی‌سازی پیام‌های خطا، می‌توان داده‌های ورودی را به شکلی بهینه مدیریت کرد و از بروز خطاهای امنیتی و عملکردی جلوگیری کرد.

در پست‌های بعدی، به بررسی دقیق‌تر ساختار ولیدیشن‌ها و نحوه‌ی پیاده‌سازی قوانین سفارشی می‌پردازیم.

#laravel #لاراول #فصل_۶
@AmirhDeveloper
.

Rekordlar

17.04.202523:59
630Obunachilar
20.04.202516:13
400Iqtiboslar indeksi
06.04.202508:53
399Bitta post qamrovi
06.04.202508:53
567Reklama posti qamrovi
10.04.202523:59
13.51%ER
31.03.202508:53
64.35%ERR

Rivojlanish

Obunachilar
Iqtibos indeksi
1 ta post qamrovi
Reklama posti qamrovi
ER
ERR
БЕР '25БЕР '25БЕР '25КВІТ '25КВІТ '25КВІТ '25

| AmirHossein | mashhur postlari

09.04.202511:32
دوستان دو مورد رو بگم بهتون

یک اینکه، دوره لاراول رو یه وقفه طولانی انداختم.
حقیقتا بعد ۵ فصل مخصوصا فصل های مربوط به دیتابیس خیلی خسته شدم و یه استراحتی کردم😂
الان مجدد دارم می‌نویسم، و به زودی مثل قبل هر روز یک پست میذارم ازش.

دوم اینکه، من معمولا همه دوره هارو خودم می‌نویسم، ولی این دوره PHP Streams به صورت خاص با Chat GPT و حالت Deep Research نوشته شده.
هدف من تست این قابلیت GPT بود، ولی خیلی کامل و جامع توضیح داد، منم یه سری تغییرات ریز دادم و به صورت پست به اشتراک میذارمش.

سوم اینکه، از محتوا هم یک حمایتی بکنید بیشتر دیده بشه، و ممنون از دوستانی که حمایت کردن❤️
06.04.202513:04
استریم‌ ها در PHP - قسمت دوم

3- php://stdin

این استریم نمایانگر ورودی استاندارد (STDIN) فرایند PHP است. در محیط خط فرمان (CLI)، php://stdin همان داده‌ای است که از کاربر یا از ورودی pipeline دریافت می‌شود.

در اسکریپت‌های PHP CLI که نیاز به خواندن ورودی کاربر از کنسول یا داده‌های piped از فرمان دیگر دارند، می‌توان این استریم را به کار برد. به عنوان مثال، برنامه‌ای که منتظر می‌ماند کاربر در ترمینال متنی وارد کند یا نتیجه اجرای یک دستور دیگر را از طریق pipe دریافت کند.

$fp = fopen("php://stdin", "r");

این اسکریپت ابتدا پیغام درخواست ورودی را در کنسول نمایش می‌دهد. سپس با fopen استریم را باز کرده و با fgets یک خط از آن می‌خواند (منتظر می‌ماند تا کاربر یک خط متن وارد کرده و Enter بزند). در نهایت همان خط را مجدداً در خروجی نمایش می‌دهد.

این استریم فقط خواندنی است و مخصوص محیط‌های تعاملی یا ورودی‌های خط فرمان می‌باشد (در حالت اجرای وب معمولاً کاربردی ندارد).
———
4- php://stdout

این استریم معادل خروجی استاندارد (STDOUT) در PHP است. در حالت CLI، هر چیزی که به php://stdout نوشته شود در کنسول به نمایش در می‌آید (مشابه عملکرد echo).

بیشتر در اسکریپت‌های خط فرمان کاربرد دارد، زمانی که بخواهید به صورت صریح به STDOUT بنویسید. هرچند در عمل استفاده مستقیم از php://stdout تفاوتی با php://output (در حالت CLI) ندارد، اما ممکن است برای شفاف‌سازی منظور یا برای کدنویسی سیستم‌هایی که مستقیماً با توصیف‌گرهای STDOUT کار می‌کنند، استفاده شود.

$fp = fopen("php://stdout", "w");

اجرای این کد در محیط خط فرمان، متن "Test message on STDOUT" را در خروجی ترمینال نمایش می‌دهد. این همان خروجی استاندارد برنامه است.

توجه کنید که در محیط وب (مثلاً اجرای PHP از طریق Apache یا Nginx)، STDOUT همان خروجی HTML ارسالی به مرورگر است، لذا php://stdout در آن context معادل php://output عمل می‌کند.
———
5- php://stderr

این استریم متناظر با خروجی خطا (STDERR) در PHP است. STDOUT و STDERR هر دو خروجی هستند اما به طور مجزا مدیریت می‌شوند؛ معمولاً STDOUT برای خروجی معمول برنامه و STDERR برای پیام‌های خطا یا لاگ خطاها استفاده می‌شود.

در اسکریپت‌های CLI یا محیط‌هایی که می‌خواهید پیام‌های خطا را جدا از خروجی معمول ارسال کنید. برای مثال، می‌توانید لاگ خطا یا هشدارها را به این استریم بنویسید تا در کنسول یا لاگ سرور به عنوان خطا ثبت شوند، بدون اینکه جریان عادی خروجی (STDOUT) را مختل کنند.

$fp = fopen("php://stderr", "w");

این قطعه کد در محیط خط فرمان، متن خطا را به STDERR می‌فرستد. در نتیجه اگر برنامه را اجرا کنید، پیغام "Err: Not found!" به عنوان خروجی خطا ثبت می‌شود (در ترمینال معمولاً با رنگ قرمز یا در جریان مجزا نمایش داده می‌شود).

در حالت وب، محتوایی که به آن نوشته شود توسط وب‌سرور ممکن است در لاگ خطای سرور ثبت گردد.
———
6- php://memory

این استریم یک فضای حافظه موقتی در RAM ایجاد می‌کند که می‌توان مانند یک فایل با آن رفتار کرد. تمام داده‌هایی که در php://memory نوشته می‌شوند، در حافظه RAM ذخیره می‌شوند. هنگامی که نیاز دارید یک رشته یا داده حجیم را موقتاً مانند یک فایل مدیریت کنید اما نمی‌خواهید روی دیسک نوشته شود.

برای مثال تولید محتوای پویا (مثل ایجاد یک فایل CSV در حافظه و سپس ارائه آن برای دانلود) یا جمع‌آوری خروجی‌های متعدد و سپس پردازش یا ارسال آن. مزیت استفاده از حافظه این است که عملیات سریع‌تر است (عدم نیاز به دیسک) البته به میزان حافظهٔ قابل دسترس PHP محدود است.

$fp = fopen("php://memory", "r+");

در این مثال، ابتدا یک استریم حافظه باز می‌کنیم (r+ به معنی خواندن/نوشتن). سپس دو رشته "Foo" و "Bar" در آن نوشته می‌شود. با rewind مکان فایل را به ابتدای حافظه برمی‌گردانیم و با stream_get_contents کل محتوا را می‌خوانیم؛ حاصل رشتهٔ "FooBar" است که نشان می‌دهد داده‌ها با موفقیت در حافظه جمع‌آوری شده‌اند.

تمام این عملیات بدون نوشتن حتی یک بایت روی دیسک انجام شده است.

در قسمت های بعدی با سایر استریم‌ها در PHP آشنا خواهیم شد.

#PHP #PHP_streams
@AmirhDeveloper
.
10.04.202511:19
استریم‌ ها در PHP - قسمت ششم

- استریم‌های فشرده‌سازی و آرشیو

3- zip://

این استریم رپر اجازه می‌دهد محتویات یک فایل ZIP را مانند یک سیستم فایل مجزا مشاهده و دستکاری کنید. با آن می‌توانید فایل‌های درون یک آرشیو ZIP را بخوانید بدون آنکه نیاز باشد کل آرشیو را دستی از حالت فشرده خارج کنید. برای اشاره به یک فایل داخل ZIP، از علامت # در مسیر استفاده می‌شود.

فرض کنید یک آرشیو zip حاوی چند فایل CSV دارید و می‌خواهید یکی از آنها را مستقیماً پردازش کنید؛ با zip:// می‌توانید مستقیماً آن فایل CSV را باز کنید. یا برای لیست کردن محتویات آرشیو می‌توانید مانند یک دایرکتوری عمل کنید.

توجه داشته باشید که این قابلیت نیازمند فعال بودن اکستنشن Zip در PHP است.

$content = file_get_contents("zip://". __DIR__ . "/archive.zip#readme.txt");

در اینجا با استفاده از file_get_contents به مسیر zip://.../archive.zip#readme.txt دسترسی پیدا کرده‌ایم. بخش قبل از # مسیر آرشیو ZIP روی دیسک را مشخص می‌کند و بعد از # نام فایلی داخل آن آرشیو را.

آرشیو را باز کرده، به فایل readme.txt درون آن دسترسی پیدا می‌کند و محتوایش را برمی‌گرداند. به همین ترتیب می‌توان هر فایلی را داخل ZIP با fopen یا حتی include (برای فایل‌های PHP داخل phar/zip) باز کرد.

این رپر فقط خواندن را پشتیبانی می‌کند؛ برای نوشتن به ZIP باید از کلاس‌های شیءگرای ZipArchive استفاده کنید.

———
4- phar://

‏Phar مخفف "PHP Archive" است و یک قالب آرشیو مخصوص PHP (معمولاً با پسوند .phar) می‌باشد که می‌تواند شامل فایل‌های PHP، کتابخانه‌ها و سایر منابع باشد. استریم phar:// اجازه می‌دهد فایل‌های داخل یک آرشیو Phar را همانند Zip به صورت شفاف بخوانید و حتی اجرا (include/require) کنید.
این قابلیت به توزیع و استفاده از برنامه‌ها یا کتابخانه‌های PHP در قالب یک فایل واحد کمک می‌کند.

برای مثال، Composer خودش به صورت یک فایل phar توزیع می‌شود که شما می‌توانید آن را با PHP اجرا کنید. با phar:// می‌توانید به محتویات آن دسترسی داشته باشید.

همچنین از این طریق می‌توان کد PHP را مستقیماً از Phar include کرد. نوشتن در Phar نیز ممکن است (Pharها می‌توانند در حالت قابل نوشتن باز شوند) اما معمولاً Pharها به صورت فقط خواندنی در برنامه‌ها استفاده می‌شوند.

require "phar://package.phar/lib/functions.php";

در این مثال، فایل lib/functions.php واقع در داخل آرشیو package.phar مستقیماً بارگذاری (require) شده است. یعنی حتی بدون اینکه آن را از آرشیو روی دیسک استخراج کنیم، PHP قادر است محتویاتش را تفسیر و اجرا کند.

از دید برنامه‌نویسی، این کار تفاوتی با require کردن یک فایل عادی ندارد، جز اینکه داریم از یک بستهٔ Phar می‌خوانیم. اگر بخواهیم محتوای غیر PHP (مثلاً یک فایل متنی) را از Phar بخوانیم، می‌توانیم از file_get_contents("phar://...") یا روش‌های مشابه استفاده کنیم.

———
5- rar://

این استریم رپر عملکردی مشابه zip:// دارد اما برای فرمت آرشیو RAR استفاده می‌شود. فایل‌های RAR به صورت پیش‌فرض توسط PHP پشتیبانی نمی‌شوند مگر اینکه اکستنشن RAR فعال شده باشد.

$fp = fopen("rar://files.rar#doc.txt", "r");

این کد فرضی نشان می‌دهد که چگونه می‌توان از rar:// استفاده کرد. مانند Zip، پس از علامت # نام فایل درون آرشیو را مشخص می‌کنیم. با fopen و خواندن محتوا، PHP آرشیو را باز کرده و داده‌های فایل doc.txt را به ما می‌دهد.

از آنجا که پشتیبانی RAR به صورت پیش‌فرض موجود نیست، هنگام استفاده در محیط عملی باید اطمینان حاصل کنید که افزونه PECL RAR نصب و فعال شده باشد.

در قسمت های بعدی با سایر استریم‌ها در PHP آشنا خواهیم شد.

#PHP #PHP_streams
@AmirhDeveloper
.
08.04.202511:59
استریم‌ ها در PHP - قسمت چهارم

استریم‌های سیستم فایل (File Streams)

1- file://

این استریم امکان دسترسی به سیستم فایل محلی سرور را فراهم می‌کند. file:// در PHP پیش‌فرض‌ترین استریم است؛ یعنی حتی اگر هیچ پروتکلی قبل از مسیر فایل ننویسید و مستقیم مسیری را بدهید، در واقع از همین پروتکل فایل استفاده می‌شود.

با file:// می‌توانید فایل‌های روی دیسک محلی را بخوانید، بنویسید، ایجاد کنید یا تغییر نام دهید – درست مانند کاری که با توابع معمول فایل انجام می‌دهید.

خواندن و نوشتن فایل‌های معمولی. مثلاً خواندن محتوای یک فایل متنی جهت نمایش در صفحه، نوشتن لاگ در یک فایل .log، ایجاد یک فایل پیکربندی و ... . از آنجا که این پروتکل به منابع محلی دسترسی دارد، امنیت آن وابسته به دسترسی‌های فایل‌سیستم است (PHP فقط می‌تواند فایل‌هایی را بخواند/بنویسد که مجوزش را دارد).

$data = file_get_contents("file://example.txt");

در این مثال، تابع file_get_contents را با مسیر file://... صدا زده‌ایم تا محتوای فایل example.txtخوانده شود.

استفاده از file:// در اینجا اختیاری است؛ زیرا اگر به جای آن مستقیماً مسیر فایل را می‌نوشتیم (مثلاً "example.txt")، PHP به صورت خودکار از استریم فایل استفاده می‌کرد.

توجه داشته باشید برای اشاره به مسیرهای مطلق در سیستم‌عامل ویندوز، سه اسلش بعد از file: لازم است .
مثال:
file:///C:/path/to/file.txt


———
2- glob://

این استریم رپر امکان استفاده از الگوهای glob را به شکل یک منبع داده فراهم می‌کند. به طور معمول، تابع glob() در PHP رشته‌های مسیر را بر اساس الگو (pattern) تطبیق داده و لیستی از نام فایل‌ها را برمی‌گرداند. glob:// این قابلیت را در قالب یک استریم پیاده‌سازی می‌کند که می‌توان آن را مانند یک دایرکتوری مجازی پیمایش کرد.

زمانی که بخواهید با استفاده از یک الگوی خاص، مجموعه‌ای از فایل‌ها یا مسیرها را پردازش کنید. مثلاً پیدا کردن همه فایل‌های .log در یک پوشه و خواندن تک‌تک آن‌ها. با این استریم می‌توانید این کار را بدون صدا زدن تابع جداگانه glob و سپس حلقه روی نتایج، انجام دهید – مستقیماً به عنوان یک پوشه با محتوای فیلترشده باز می‌کنید.

if ($dir = opendir("glob://*.txt")) {

در این قطعه کد، از opendir با مسیر glob://*.txt استفاده کرده‌ایم. نتیجهٔ این opendir مثل این است که یک دایرکتوری باز کرده باشیم که فقط شامل فایل‌هایی است که با الگوی *.txt تطابق دارند. سپس با readdir در یک حلقه، تک‌تک نام این فایل‌ها را می‌خوانیم و چاپ می‌کنیم. در نهایت closedir را فراخوانی می‌کنیم.

استفاده از glob:// می‌تواند کدنویسی را در شرایطی که می‌خواهید روی مجموعه‌ای از فایل‌های منطبق با الگو کار کنید ساده‌تر کند.

در قسمت های بعدی با سایر استریم‌ها در PHP آشنا خواهیم شد.

#PHP #PHP_streams
@AmirhDeveloper
.
11.04.202511:00
استریم‌ ها در PHP - قسمت هفتم

- سایر استریم‌های ویژه

1- data://

این یک استریم رپر خاص است و به شما امکان می‌دهد داده‌های خام را به شکل یک URL داخلی در خود اسکریپت جاگذاری کنید.
با آن می‌توانید یک رشته داده (مثل متن یا حتی دادهٔ باینری به صورت Base64) را طوری استفاده کنید که گویی یک فایل است.

ساختار کلی آن به صورت
data://;base64,

یا
data://,

است.

موارد استفاده محدود ولی جالبی دارد؛ مثلاً برای تست و دمو می‌توانید به جای ایجاد یک فایل فیزیکی، محتوای آن را با data URI در خود کد قرار دهید. یا می‌توان از آن برای include کردن تکه کد PHP استفاده کرد.

به طور کلی، data:// زمانی به کار می‌آید که منبع داده شما از پیش در قالب یک رشته در دسترس است و می‌خواهید آن را مانند یک فایل رفتار دهید.

$quote = file_get_contents("data://text/plain;base64,SGVsbG8sIFdvcmxkIQ==");

در اینجا از data:// با MIME type برابر text/plain و داده‌های Base64 استفاده کرده‌ایم.
رشته Base64 داده‌شده SGVsbG8sIFdvcmxkIQ== در واقع متن "Hello, World!" را نمایندگی می‌کند. با file_get_contents این منبع data URI را خواندیم و در خروجی چاپ کردیم؛ لذا نتیجه Hello, World! نمایش داده می‌شود.

همانطور که گفت شد، می توان یک کد PHP را به شکل Base64 تبدیل کرد، و آن را include کنیم.
include "data://text/plain;base64,PD9waHAgaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQvcGxhaW4nKTtlY2hvICdIZWxsbyBXb3JsZCc7Pz4=";


لبته استفاده از data:// برای include مستلزم فعال بودن allow_url_include است و به لحاظ امنیتی همیشه توصیه نمی‌شود، اما وجود چنین امکانی بیانگر انعطاف بالای استریم‌ها در PHP است.

———
2- ssh2.xxx://

این استریم‌ها مربوط به دسترسی از طریق پروتکل Secure Shell (SSH2) هستند و در صورتی در دسترس‌اند که اکستنشن SSH2 بر روی PHP نصب باشد.

با ssh2.sftp:// می‌توان به سیستم فایل روی یک سرور از طریق SFTP دسترسی داشت،و با ssh2.scp:// امکان کپی فایل به/از سرور از طریق SCP فراهم است.
همچنین ssh2.shell:// و ssh2.exec:// و ssh2.tunnel:// برای مقاصد مختلفی مثل اجرای دستورات روی سرور راه دور، ایجاد تونل SSH و غیره وجود دارند.

اگر نیاز به تعامل با فایل‌ها یا اجرای دستورات روی یک سرور دیگر از طریق SSH دارید، این استریم‌ها کار را ساده می‌کنند. به عنوان مثال، برای خواندن یک فایل روی سرور B از اسکریپت PHP که روی سرور A اجرا می‌شود، می‌توان از
ssh2.sftp://user:pass@host:22/path/to/file

استفاده کرد.

$fp = fopen("ssh2.sftp://user:password@remote-server.com:22/home/user/remote.txt", "r");

در این مثال فرضی، یک اتصال SFTP به سرور remote-server.com با نام‌کاربری و رمز داده‌شده برقرار می‌شود و فایل remote.txt خوانده می‌شود.

استفاده از این رپرها به شما امکان می‌دهد بدون نیاز به ابزار خارجی یا کتابخانهٔ اضافه، مستقیماً از توابع استریم PHP (مانند fopen و غیره) برای تعامل با SSH/SFTP بهره ببرید.

طبیعتاً برای اینکه این کار عمل کند باید افزونه SSH2 نصب و فعال باشد و اعتبارنامه‌های ورود صحیح باشند. در غیر این صورت، PHP این آدرس را نخواهد شناخت.

———
3- ogg://

این استریم رپر برای کار با داده‌های رسانه‌ای فرمت Ogg طراحی شده است. Ogg یک قالب کانتینر چندرسانه‌ای (معمولاً صوتی) است. پشتیبانی از ogg:// در PHP مستلزم نصب بودن کتابخانه/افزونهٔ مربوط به فرمت Ogg می‌باشد.

در عمل این مورد بسیار کمتر استفاده شده است، اما تصور کنید می‌خواهید جریان صوتی یک فایل OGG را پردازش یا پخش کنید. با ogg:// می‌توانید مستقیماً محتوا را خوانده و احتمالاً با فیلترهای مناسب decode کنید. به طور خلاصه، این رپر برای خواندن دادهٔ خام از درون فایل‌های .ogg (مثلاً استخراج جریان‌های صوتی) به کار می‌رود و برای اکثر توسعه‌دهندگان PHP کاربرد روزمره‌ای ندارد مگر در پروژه‌های خاص مالتی‌مدیا.

استفاده از ogg:// به طور مستقیم شاید ساده نباشد زیرا نیاز به دانستن ساختار درونی Ogg و به‌کارگیری فیلتر یا کتابخانه جهت تفسیر داده‌ها دارد. اما در سطح استریم، مثال کلی می‌تواند به شکل زیر باشد:
$fp = fopen("ogg://song.ogg", "r");

در اینجا $fp حاوی استریم رمزگذاری‌شده صوتی خواهد بود و برای تبدیل به صدای قابل پخش باید از توابع decode صوت (یا انتقال آن به پلیر مناسب) استفاده کرد.

در قسمت های بعدی با سایر استریم‌ها در PHP آشنا خواهیم شد.

#PHP #PHP_streams
@AmirhDeveloper
.
دیگه LaraGram داره از کنترل خارج میشه
04.04.202522:09
تعطیلات هم تموم شد، ایشالا از فردا ادامه دوره لاراول رو شروع می‌کنیم.

یکم حمایت هم بکنید از کانال، از ۸۰۰ تا شدیم ۶۰۰ تا. 🤝❤️
07.04.202514:55
استریم‌ ها در PHP - قسمت سوم

7- php://temp

این استریم نیز رفتاری شبیه به php://memory دارد با این تفاوت که اگر حجم داده‌های نوشته‌شده از مقدار معینی بیشتر شود، به طور خودکار محتوا را در یک فایل موقت روی دیسک ذخیره می‌کند تا حافظه زیادی مصرف نشود (حد پیش‌فرض معمولاً ۲ مگابایت است).

مانند php://memory برای نگهداری موقت داده‌ها استفاده می‌شود، با این اطمینان که اگر داده خیلی بزرگ شد، به جای پر کردن RAM، به دیسک منتقل می‌شود.

این استریم برای مواردی مفید است که اندازهٔ داده از قبل مشخص نیست و ممکن است کوچک یا بسیار بزرگ باشد. شما می‌توانید بدون نگرانی از مدیریت دستی حافظه/دیسک، به سادگی داده‌ها را در php://temp بنویسید.

$fp = fopen("php://temp", "r+");

این کد رشته "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");

در این مثال، ما از استریم فیلتر استفاده کرده‌ایم تا محتوای فایل input.txt را با فیلتر string.toupper (که همه حروف انگلیسی را به بزرگ تبدیل می‌کند) بخوانیم.

عبارت resource=input.txt در واقع به PHP می‌گوید منبع نهایی input.txt است اما قبل از تحویل داده، فیلتر string.toupper را بر داده‌های خوانده‌شده اعمال کن.

نتیجهٔ این کد نمایش محتوای فایل به صورت حروف بزرگ است، بدون اینکه نیاز باشد پس از خواندن، خودمان تابعی برای بزرگ‌کردن حروف صدا بزنیم. به همین شکل فیلترهای متنوعی برای حذف تگ‌های HTML، انکود/دیکود کردن Base64، فشرده‌سازی و... وجود دارد که می‌توان در php://filter به کار گرفت.

توجه داشته باشید که نحوه نگارش می‌تواند برای نوشتن نیز باشد
مثلاً
php://filter/write=/resource=<...>
هنگام fwrite و حتی می‌توان فیلترها را زنجیره‌ای اعمال کرد.

———
9- php://fd

این استریم امکان دسترسی مستقیم به یک توصیف‌گر فایل باز سیستم‌عامل (file descriptor) را فراهم می‌کند. در محیط‌های یونیکس، هر فرایند مجموعه‌ای شماره‌گذاری‌شده از توصیف‌گرهای فایل دارد:
0 برای STDIN
1 برای STDOUT
2 برای STDERR
و اعداد بالاتر برای فایل‌ها یا سوکت‌های باز.

با استفاده از
php://fd/
می‌توان به توصیف‌گر مربوطه در PHP دسترسی گرفت.

این قابلیت نسبتاً خاص است و عمدتاً در اسکریپت‌های CLI یا موارد خیلی پیشرفته استفاده می‌شود. برای مثال اگر PHP توسط یک فرایند دیگر با توصیف‌گرهای اضافی فراخوانی شود (مثلاً descriptor 3 به یک فایل خاص اشاره کند)، می‌توان از php://fd/3 برای دسترسی به آن استفاده کرد. یا جهت تأیید، php://fd/1 اساساً خروجی استاندارد و معادل php://stdout است.

$fp = fopen("php://fd/1", "w");

در اینجا با بازکردن php://fd/1، مستقیماً به خروجی استاندارد نوشته‌ایم؛ این کار همان اثر php://stdout را دارد.

در عمل شما ممکن است کمتر مستقیماً از php://fd استفاده کنید مگر در شرایط خاص، زیرا PHP معادل‌های راحت‌تری برای STDIN/STDOUT/STDERR دارد. اما دانستن وجود آن برای موارد پیچیده (یا مثلاً تعامل با کتابخانه‌هایی که descriptorها را مدیریت می‌کنند) خالی از لطف نیست.

در قسمت های بعدی با سایر استریم‌ها در PHP آشنا خواهیم شد.


#PHP #PHP_streams
@AmirhDeveloper
.
20.04.202515:40
استریم‌ ها در PHP - قسمت نهم

- ساخت استریم رپر سفارشی


همانطور که در قسمت های قبل گفته شد، به صورت پیش‌فرض چندین Stream Wrapper داخلی وجود دارد.
با این حال، PHP این امکان را فراهم کرده است که پروتکل‌های سفارشی خود را به عنوان Stream Wrapper پیاده‌سازی کنیم تا توابع فایل‌سیستم روی منابع دلخواه ما عمل کنند​.

به عبارتی می‌توانیم یک Stream Wrapper سفارشی بسازیم و آن را با یک اسکیم (پروتکل) دلخواه (مثلاً myprot://) ثبت کنیم و سپس با توابع معمولی PHP مثل fopen() یا file_get_contents() به منابع سفارشی خود دسترسی داشته باشیم.

- مراحل ساخت Stream Wrapper سفارشی

ابتدا یک کلاس PHP تعریف می‌کنیم که متدهای لازم برای یک Stream Wrapper را پیاده‌سازی کند. این متدها شامل عملیات پایه‌ای مانند باز کردن، خواندن، نوشتن و ... روی منبع سفارشی هستند و با نام های خاص و از پیش تعیین شده پیاده سازی می شوند (در بخش بعد لیست کامل متدها توضیح داده خواهد شد).

نام کلاس می‌تواند دلخواه باشد (مثلاً MyStreamWrapper) و این کلاس نماینده‌ی پروتکل سفارشی ما خواهد بود که متدهای ما در آن تعریف می شوند.

پس از تعریف کلاس، باید آن را به PHP معرفی (ثبت) کنیم.
برای این کار از تابع stream_wrapper_register استفاده می‌شود.
پارامتر اول نام پروتکل (اسکیم) دلخواه ما به صورت رشته (مثلاً "myprot") و پارامتر دوم نام کلاس پیاده‌کننده‌ی آن پروتکل است.

اگر ثبت با موفقیت انجام شود، از این پس هر زمان که PHP با آدرسی به شکل myprot://... مواجه شود، به جای دسترسی مستقیم به فایل‌سیستم، متدهای کلاس ما را فراخوانی می‌کند. در صورت عدم موفقیت در ثبت (مثلاً اگر نام پروتکل تکراری باشد) این تابع مقدار false برمی‌گرداند.

پس از ثبت پروتکل سفارشی، می‌توانیم از آن دقیقاً مانند سایر پروتکل‌ها استفاده کنیم.
برای مثال، می‌توان با fopen("myprot://something", "r") یک منبع را باز کرد که منجر به اجرای متد stream_open (یکی از متدهای خاص و از پیشی تعیین شده) در کلاس ما می‌شود.

برای روشن‌تر شدن موضوع، یک مثال ساده در نظر بگیرید. فرض کنیم می‌خواهیم یک Stream Wrapper بنام var:// پیاده‌سازی کنیم که با آن بتوان داده‌ها را مستقیماً در یک متغیر PHP ذخیره و بازیابی کرد (نوعی استریم درون‌حافظه‌ای).
کلاس ما مثلاً VariableStream نام دارد و داده‌ها را در یک متغیر سراسری با نام مشخص ذخیره می‌کند:
class VariableStream {

نکته: برای خوانایی بهتر کد، پیشنهاد می‌شود آن را درون یک ادیتور باز کنید.

در مثال بالا، ابتدا پروتکل var:// به کلاس VariableStream نگاشت شده است.

سپس متغیری به نام $myvar تعریف شده و با fopen("var://myvar", "r+") یک استریم خواندن/نوشتن روی آن باز می‌کنیم. این عمل باعث فراخوانی stream_open در کلاس می شود.

با fwrite در واقع متد stream_write کلاس فراخوانی می‌شود و داده را در متغیر ذخیره می‌کند.

در پایان fclose($fp) استریم را می‌بندد (که منجر به stream_close در کلاس می‌شود، هرچند در این مثال ما این متد را پیاده‌سازی نکرده‌ایم).

در نهایت خروجی به صورت زیر خواهد بود:
string(12) "Hello
World
"


همانطور که مشاهده می‌کنید، با استفاده از Stream Wrapper سفارشی، توانستیم عملیات فایل‌گونه (خواندن/نوشتن) را روی یک متغیر ساده انجام دهیم، گویی که یک فایل است.

در قسمت های بعد، تمامی متدهایی که می‌توان در یک Stream Wrapper سفارشی پیاده‌سازی کرد را معرفی کرده و کاربرد هر کدام را توضیح می‌دهیم.

#PHP #PHP_streams
@AmirhDeveloper
.
12.04.202511:03
استریم‌ ها در PHP - قسمت هشتم

- سایر استریم‌های ویژه

4- expect://

این استریم توسط افزونه PECL Expect فراهم می‌شود و به شما امکان تعامل با فرآیند‌های شبه‌تعاملی (مانند شبیه‌سازی رفتار ابزار expect در لینوکس) را می‌دهد.

با expect:// می‌توانید یک دستور سیستم‌عامل را اجرا کنید که منتظر ورودی کاربر است و سپس به صورت برنامه‌نویسی با آن تعامل کنید (ارسال ورودی‌ها و خواندن خروجی‌ها)، گویی که یک کاربر پشت ترمینال نشسته است.

مثلاً فرض کنید می‌خواهید از داخل PHP یک اسکریپت Python را اجرا کنید که در حین اجرا چند سوال yes/no از کاربر می‌پرسد. با expect:// می‌توانید PHP را طوری برنامه‌نویسی کنید که به آن سوالات پاسخ بفرستد و خروجی را دریافت کند.

این یک مورد پیشرفته است و بیشتر در محیط‌های خاص DevOps یا تست خودکار ابزارهای خط فرمان استفاده می‌شود.

$fp = fopen("expect://ftp", "w+");

در این مثال فرضی، ما برنامه ftp را با استریم expect باز کرده‌ایم. سپس چند فرمان را به آن ارسال کردیم (باز کردن اتصال، فرستادن نام‌کاربری و رمز). با fgets نیز خروجی برنامه ftp را خط‌به‌خط می‌خوانیم و چاپ می‌کنیم.

طبیعتاً در یک اسکریپت expect واقعی، شما منطق اضافه‌تری می‌نویسید تا تشخیص دهید چه زمانی ftp منتظر ورودی است (مثلاً عبارت "Password:" در خروجی ظاهر شد تا سپس رمز را ارسال کنید).

افزونه expect این امکانات تطبیق الگو را فراهم می‌کند. این توانمندی بسیار قدرتمند است اما محدود به مواقع خاص و نیازمند نصب extension است.

———

تا این قسمت با تمامی استریم های پیشفرض PHP آشنا شده ایم.

در قسمت بعد به ساخت استریم ها اختصاصی و شخصی سازی شده خواهیم پرداخت.


#PHP #PHP_streams
@AmirhDeveloper
.
05.04.202512:24
استریم‌ ها در PHP - قسمت اول

در PHP، استریم (Stream) یک سازوکار انتزاعی برای مدیریت ورودی و خروجی داده‌ها است. به زبان ساده، استریم‌ها به شما امکان می‌دهند انواع مختلف منابع داده (مانند فایل‌های سیستم، درخواست‌های شبکه، داده‌های فشرده و ...) را از طریق یک رابط یکسان بخوانید یا بنویسید.

به جای آنکه برای هر نوع منبع تابع‌ها یا روش‌های جداگانه‌ای داشته باشید، PHP با استفاده از استریم‌ها یک مجموعه توابع عمومی (مثل fopen, fread, fwrite و ...) فراهم کرده که با همه این منابع به شکل یکنواخت رفتار می‌کنند.

هر استریم رَپر (Stream Wrapper) در PHP در واقع یک پروتکل یا طرح (scheme) خاص را پیاده‌سازی می‌کند که به صورت scheme:// استفاده می‌شود. برای مثال، file:// برای دسترسی به سیستم فایل محلی، http:// برای منابع وب، یا php:// برای منابع داخلی PHP استفاده می‌شود.

‏PHP به طور پیش‌فرض تعداد زیادی استریم رپر داخلی دارد که بسیاری از کارهای معمول را پوشش می‌دهند. شما می‌توانید توسط این استریم‌ها به سادگی کارهایی مثل خواندن فایل‌ها، دریافت داده از وب, نوشتن خروجی، خواندن ورودی خام درخواست‌ها و حتی کار با داده‌های فشرده‌شده را انجام دهید، بدون اینکه نگران جزئیات سطح پایین هر کدام باشید.

استریم‌های داخلی PHP - ‏php://

1- php://input

این استریم برای دسترسی به دادهٔ ورودی خام HTTP در PHP استفاده می‌شود. به طور خاص، این استریم محتوای خام بدنهٔ درخواست HTTP را (معمولاً در درخواست‌های POST یا PUT) ارائه می‌کند، بدون هیچ‌گونه پردازش یا parse خودکار.

زمانی که نیاز دارید ورودی خام درخواست را بخوانید (مثلاً دریافت داده‌های JSON از یک API کلاینت یا پردازش درخواست‌های RESTful)، این استریم بسیار مفید است. برخلاف متغیرهای سراسری مانند $_POST که فقط داده‌های form-urlencoded را می‌گیرند،
این استریم اجازه می‌دهد انواع داده‌ها (JSON, XML, متن خام و ...) را مستقیماً از بدنهٔ درخواست دریافت کنید.

$json = file_get_contents("php://input");

در این مثال، محتوای خام ورودی HTTP با file_get_contents از php://input خوانده شده و سپس از JSON به آرایه PHP تبدیل می‌گردد.
در نهایت نام کاربر خروجی گرفته می‌شود. اگر درخواست فوق رشتهٔ JSON
{"user": "Ali"}

را ارسال کرده باشد، خروجی برنامه Hello Ali خواهد بود.

توجه داشته باشید php://input فقط خواندنی است و فقط یک بار می‌توان محتوا را از آن خواند، یعنی پس از خواندن، محتوای آن خالی می‌شود. همچنین در مورد درخواست‌های معمولی فرم (مانند multipart/form-data برای آپلود فایل)، استفاده از این استریم توصیه نمی‌شود، زیرا PHP آن داده‌ها را قبلاً پردازش کرده است.

2- php://output

این استریم خروجی استاندارد اسکریپت PHP را نمایندگی می‌کند. هر داده‌ای که در آن نوشته شود، مستقیماً به خروجی معمول برنامه (همان چیزی که مرورگر دریافت می‌کند یا در CLI ترمینال نشان داده می‌شود) فرستاده می‌شود.
زمانی که بخواهید با توابع استریم داده‌ای را به خروجی بفرستید (به جای استفاده از echo یا print)، می‌توانید php://output را مانند یک فایل باز کرده و در آن بنویسید.

این قابلیت می‌تواند در سناریوهایی مفید باشد که یک تابع انتظار یک منبع استریم برای خروجی دارد یا هنگامی که می‌خواهید خروجی را از سایر عملیات جدا کنید.

$fp = fopen("php://output", "w");

در این قطعه کد، ما استریم خروجی را باز کرده‌ایم و یک خط متن را با fwrite در آن نوشتیم. نتیجهٔ اجرای این کد نمایش متن ذکر شده در خروجی (مثلاً مرورگر یا کنسول) است. در واقع کاری که fwrite در اینجا انجام می‌دهد معادل همان echo کردن رشته‌ها است.

در قسمت های بعدی با سایر استریم‌ها در PHP آشنا خواهیم شد.

#PHP #PHP_streams
@AmirhDeveloper
.
05.04.202512:15
فصل شش - Requests and Response

بخش دوم - اعتبارسنجی درخواست ها


اعتبارسنجی ها عمدتا به 3 روش انجام می شوند. در این پست به 2 روش آن اشاره می شود و روش سوم در پست های بعدی کامل بررسی خواهد شد.

یکی از روش های مرسوم اعتبارسنجی بر روی درخواست ها (ورودی ها POST، GET و...) فراخوانی متد validate از متغیر $request می باشد.
public function store(Request $request)


کد بالا درخواست ما را اعتبارسنجی می کند، به عنوان مثال، مقدار input با نام title باید required، unique و طول حداکثر 255 کاراکتر داشته باشد.
اگر همه این ویژگی ها را داشته باشد اعتبارسنجی درخواست موفقیت آمیز بوده، در غیر اینصورت یک آرایه از error ها ایجاد می شود.

روش دیگر اعتبارسنجی استفاده از فساد Validator است:
$validator = Validator::make($request->all(), [


کد بالا همانند روش اول است، با این تفاوت که می توان اعتبارسنجی را روی داده های دلخواه (پارامتر اول متد make که برابر تمامی ورودی های درخواست قرار کرفته) انجام داد.

هر دو روش مرسوم و پرکاربرد هستند که بسته به نیاز استفاده می شوند.

پس از انجام اعتبار سنجی یک شئ از Validator باز می گردد که متدهایی در اختیار ما می گذارد، در ادامه به بررسی آنها خواهیم پرداخت.

1- متد fails
این متد بررسی می‌کند که آیا عملیات اعتبارسنجی شکست خورده یا نه.
if ($validator->fails()) {


2- متد validated
اگر اعتبارسنجی موفقیت‌آمیز باشد، این متد فقط داده‌های معتبر (validated) را بازمی‌گرداند. این روش، داده‌های تاییدشده را فیلتر می‌کند.
$validated = $validator->validated();


3- متد stopOnFirstFailure
اگر بخواهید عملیات اعتبارسنجی به‌محض اولین خطا متوقف شود، از این متد استفاده می‌کنید.
$validator = Validator::make($request->all(), [


4- متد validate
مقدار اعتبارسنجی‌شده را باز می‌گرداند یا اگر خطایی وجود داشته باشد، به‌صورت خودکار ValidationException پرتاب می‌کند. معمولاً در کنترلر استفاده می‌شود.
$validated = $request->validate([

در این حالت اگر فیلدی نامعتبر باشد، لاراول به‌صورت خودکار به صفحه قبل برمی‌گردد و خطاها را نمایش می‌دهد.

5- متد validateWithBag
مشابه validate() است ولی خطاها را داخل یک Error Bag خاص ذخیره می‌کند. برای مثال وقتی چند فرم در یک صفحه داریم و هرکدام باید خطاهای جداگانه داشته باشند.
$request->validateWithBag('updateProfile', [

درصورت بروز خطا، ارورها در یک Bag با نام updateProfile ذخیره می شوند.

6- متد after
پس از اجرای تمام قوانین اعتبارسنجی، می‌توانید با این متد، اعتبارسنجی‌های سفارشی اضافه کنید.
$validator->after(function ($validator) use ($request) {


7- متد errors
لیست خطاهای اعتبارسنجی را باز می‌گرداند، معمولاً در ترکیب با fails() استفاده می‌شود.
$errors = $validator->errors();


8- متد sometimes
اجرا شدن قوانین اعتبارسنجی را وابسته به شرط خاصی می‌کند.

در این مثال، اگر مقدار subscribe برابر با true باشد، فیلد email اجباری خواهد شد.

متد های دیگری نیز وجود دارد که شامل آموزش نخواهد شد.

درصوتی که یک اعتبارسنجی ناموفق باشد، خطا ها در متغیر $errors در سمت Blade در دسترس خواهد گرفت.
به عنوان مثال:
@if ($errors->any())

کد بالا درصورت وجود خطا اعتبارسنجی، خطا آنها را به کاربر نمایش می دهد.

همچنین می توان از دایرکتیو @error استفاده کنید:
@error('title')

این کد در صورتی که اینپوت title با خطا مواجه شود، متن خطای آن را به کاربر نمایش می دهد.

اگر نیاز به خطا ها از یک Bag خاص داشتید می توانید پارامتر دوم را نیز کامل کنید:
@error('title', 'myBag')


تا این بخش با روش اعتبارسنجی درخواست ها و نمایش خطاهای آن آشنا شدید، در قسمت های بعدی با Ruleهای اعتبارسنجی (required|unique|...) آشنا خواهیم شد.

#laravel #لاراول #فصل_۶
@AmirhDeveloper
.
05.04.202512:22
یه مجموعه پست از PHP Streams هم نوشتم و در کنار پست های لاراول ارسال می‌کنم.
Ko'proq funksiyalarni ochish uchun tizimga kiring.