TGViewer
| AmirHossein | | AmirHossein | @amirhdeveloper · 611 subscribers
Post #412 320
استریم‌ ها در PHP - قسمت دهم

- متدهای قابل پیاده‌سازی در استریم رپرها


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

در ادامه با این متدها آشنا می‌شویم.

1- متد stream_open
این متد برای باز کردن استریم استفاده می‌شود.

پارامتر path مسیر استریم مثل mywrapper://file.txt
پارامتر mode حالت باز کردن مثل "r", "w", "a" و غیره
پارامتر options گزینه‌های اضافی (مثل STREAM_USE_PATH)
پارامتر opened_path ارجاعی برای مسیر واقعی باز شده (اختیاری)

public function stream_open(string $path, string $mode, int $options, ?string &$opened_path): bool {
$this->position = 0;
$this->data = "";
return true;
}

// Called if:
$fp = fopen("mywrapper://file.txt", "r");

در این مثال اشاره‌گر برابر 0 قرار می گیرید، داده اولیه برابر "" قرار می گیرد و در نهایت اعلام می شود که با موفقیت انجام شده.

2- متد stream_read
برای خواندن از استریم استفاده می‌شود.

پارامتر count تعداد بایتی که قرار است خوانده شود.

public function stream_read(int $count): string|false {
$result = substr($this->data, $this->position, $count);
$this->position += strlen($result);
return $result;
}

// Called if:
$data = fread($fp, 100);

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

3- متد stream_write
برای نوشتن در استریم به کار می‌رود.

پارامترdata رشته داده‌ای که باید نوشته شود.

public function stream_write(string $data): int {
$left = substr($this->data, 0, $this->position);
$right = substr($this->data, $this->position + strlen($data));
$this->data = $left . $data . $right;
$this->position += strlen($data);
return strlen($data);
}

// Called if:
fwrite($fp, "Hello World");

داده در محل اشاره‌گر نوشته شده و موقعیت جابجا می‌شود و طول داده نوشته شده برمی‌گردد.

4- متد stream_eof
بررسی رسیدن به انتهای استریم.

public function stream_eof(): bool {
return $this->position >= strlen($this->data);
}

// Called if:
if (feof($fp)) {
echo "End of file";
}


5- متد stream_tell
موقعیت فعلی خواندن/نوشتن در استریم را برمی‌گرداند.

public function stream_tell(): int {
return $this->position;
}

// Called if:
$pos = ftell($fp);


6- متد stream_seek
برای جابجایی موقعیت خواندن/نوشتن.

پارامتر offset جابجایی
پارامتر whence مبنا (SEEK_SET, SEEK_CUR, SEEK_END)

public function stream_seek(int $offset, int $whence): bool {
$length = strlen($this->data);
switch ($whence) {
case SEEK_SET:
if ($offset >= 0 && $offset <= $length) {
$this->position = $offset;
return true;
}
return false;
case SEEK_CUR:
//
case SEEK_END:
//
default:
return false;
}
}

// Called if:
fseek($fp, 10, SEEK_SET);

جابجایی موقعیت اشاره‌گر بر اساس $offset و مبنای $whence (ابتدا، موقعیت فعلی، یا انتها).

7- متد stream_close
برای بستن استریم و آزادسازی منابع.

public function stream_close(): void {
// free up resources.
}

// Called if:
fclose($fp);


8- متد stream_flush
برای خالی کردن بافر داده‌ها به مقصد نهایی.

public function stream_flush(): bool {
// Save or send data
return true;
}

// Called if:
fflush($fp);


9- متد stream_stat
بازگرداندن اطلاعات استریم مانند اندازه و زمان تغییرات.

public function stream_stat(): array|false {
return [
'size' => strlen($this->data),
'mtime' => time(),
'mode' => 0100666,
];
}

// Called if:
$fstat = fstat($fp);


10- متد url_stat
دریافت اطلاعات مسیر بدون باز کردن استریم.

پارامتر path مسیر کامل فایل یا دایرکتوری مثل "mywrapper://file.txt"
پارامتر flags فلگ‌هایی که اطلاعات بیشتری درباره نوع stat می‌دهند. معمولاً 0 یا ترکیبی از STREAM_URL_STAT_LINK (برای گرفتن اطلاعات لینک نمادین) یا STREAM_URL_STAT_QUIET (بدون تولید خطا)

public function url_stat(string $path, int $flags): array|false {
return $this->stream_stat();
}

// Called if:
stat("mywrapper://file.txt");


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

#PHP #PHP_streams
@AmirhDeveloper
.
  • 🔥 5
  • 🍓 2
  • 👍 1
More from @amirhdeveloper
  1. Sep 30, 2026پکیج LaraGram Sentinel منتشر شد؛ یک پنل مانیتورینگ که هیچ چیزی از زیر دستش در نمی‌ره! تمام…
  2. Sep 23, 2026از امروز با کاهش شدید حاکرها مواجه میشیم
  3. Sep 19, 2026🔴 سوال سوم دو Region دارید: US-East و EU-West. کاربران در هر دو Region هستند. سیستم باید…
  4. Sep 19, 2026🟠 سوال دوم فرض کنید Service A به Service B درخواست می‌زند. B به‌دلیل overload، latency با…
  5. Sep 19, 2026🟢 سوال اول فرض کنید یک سرویس backend داریم که به PostgreSQL وصل می‌شود. تعداد requestها ن…
  6. Sep 19, 2026خیلی وقته پست‌های کانال فقط درمورد LaraGram بوده، وقتشه یکم جالب‌ترش کنیم اگر ممبرها هنوز…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →