- متدهای قابل پیادهسازی در استریم رپرها
در قسمت قبل با ساخت یک استریم رپر سفارشی آشنا شدیم.
در کلاسهای استریم رپر متدهایی با نام خاص پیادهسازی میشوند و هرکدام در مواقع خاص (مثل بازکردن استریم یا خواندن و نوشتن روی استریم) اجرا میشوند.
در ادامه با این متدها آشنا میشویم.
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
.