Stream (استریم) ها در php ورژن ۴٫۳۰ به عنوان راهی برای دسترسی به فایل , شبکه و انواع داده ها و همچنین خواندن و نوشتن بر روی فایل , پراسس ها (process) , سوکت های TCP و .. معرفی شدند.
هر استریم (stream) یک wrapper پیاده سازی برای مدیریت پروتکل (protocol) یا اینکدینگ (encoding) دارد . php بعضی از wrapper های از پیش ساخته را معرفی کرده که به راحتی می توانیم آن را بسازیم و استفاده کنیم . حتی می توانیم رفتار یا عملکرد wrapper ها را با استفاده از فیلتر ها تغییر یا افزایش بدیم .
یکی از کاربرهای مهم Stream wrapper در php استفاده از آن برای پخش ویدیو یا آهنگ بصورت آنلاین و لحظه ای است که این امکان را به ما میدهد بدون آنکه تمام ویدیو را کامل دانلود و بعد شروع به دیدن آن کنیم , می توانیم بصورت آنی و لحظه ای ویدیو را برای مخاطب پخش کنیم مانند سرویس های اشتراک ویدیوی youtube و aparat ,… .
مبانی stream ها
ساختار یک استریم (stream) بصورت زیر است
<scheme>://<target>
<scheme>
نام wrapper و <target>
به سینتکس wrapper انتخابی ما بستگی دارد .
wrapper پیش فرض file:// است که به معنای این است که می توانیم از آن برای دسترسی به فایل سیستم استفاده کنیم .
برای مثال می توانیم از readfile('/path/to/somefile.txt')
یا readfile('file:///path/to/somefile.txt')
استفاده کنیم و مطمینا نتیجه هر دو یکسان است چرا که Stream wrapper پیش فرض برای توابع کار با فایل ها file:// است .
اگر به جای مثال بالا از readfile('http://netparadis.com/')
استفاده کنیم , به php اطلاع میدیم که از HTTP Stream Wrapper استفاده کند .
همانطور که قبلا هم گفتیم , تعدادی از Stream wrapper در php پیش فرض برای پروتکل ها و فیلتر ها ارایه میدهد. برای اینکه ببینم چه wrapper هایی بر روی سیستم ما نصب است از توابع زیر که خروجی بصورت آرایه دارند استفاده میکنیم.
1 2 3 4 |
<?php print_r(stream_get_transports()); print_r(stream_get_wrappers()); print_r(stream_get_filters()); |
خروجی نصبی من بصورت زیر است :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
Array ( [0] => tcp [1] => udp [2] => unix [3] => udg [4] => ssl [5] => sslv3 [6] => sslv2 [7] => tls ) Array ( [0] => https [1] => ftps [2] => compress.zlib [3] => compress.bzip2 [4] => php [5] => file [6] => glob [7] => data [8] => http [9] => ftp [10] => zip [11] => phar ) Array ( [0] => zlib.* [1] => bzip2.* [2] => convert.iconv.* [3] => string.rot13 [4] => string.toupper [5] => string.tolower [6] => string.strip_tags [7] => convert.* [8] => consumed [9] => dechunk [10] => mcrypt.* [11] => mdecrypt.* ) |
لیست بسیار عالی از Stream wrapper در php را در بالا مشاهده میکنید
به علاوه میتوانیم از استریم های ارایه شده برای Amazon S3 , MS Excel , Google Storage , Dropbox و حتی Twitter استفاده کنیم .
Php:// wrapper
Php یک wrapper شخصی برای دسترسی به I/O
استریم زبان php دارد .(I/O مخفف Input/output یا همان ورودی/خروجی ها هستند)
Wrapper ها برای دسترسی به استریم i/o در php در زیر لیست شده اند :
php://stdin
php://stdout
php://stderr
Php://input
یک استریم read-only (فقط خواندنی) برای دریافت درخواست های POST است . این استریم بسیار کاربری است اگر بخواهید داده هایی را از سرویس های ریموت مثل api تلگرام رو از طریق وب هوک بخوانید.
خب یک مثال ساده را با cURL تست کنیم :
1 |
curl -d "Hello World" -d "foo=bar&name=John" http://localhost/dev/streams/php_input.php |
که خروجی آن با استفاده از print_r($_POST)
بصورت زیر است :
1 2 3 4 5 |
Array ( [foo] => bar [name] => John ) |
توجه کنید که اولین بسته داده ارسال از طریق آرایه $_POST
قابل دسترسی نیست اما اگر از readfile('php://input')
استفاده کنیم نتیجه به شکل زیر خواهد بود :
1 |
Hello World&foo=bar&name=John |
Php ورژن ۵٫۱ استریم wrapper های php://memory
و php://temp
را برای خواندن و نوشتن داده بصورت موقت را معرفی کرد . همانطور که از اسم آنها مشخص است , داده به صورت مرتب در حافظه یا فایل موفقت ذخیره میشود .
همجنین php://filter
یک متا wrapper برای انجام فیلتر های مختلف بر روی استریم هایی که توسط توابعی مثل readfile() , file_get_contents() / stream_get_contents()
استفاده می شود .
1 2 3 4 5 6 |
<?php // Write encoded data file_put_contents("php://filter/write=string.rot13/resource=file:///path/to/somefile.txt","Hello World"); // Read data and encode/decode readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.google.com"); |
مثال اول از یک فیلتر برای اینکد کردن داده و نوشتن آن بر روی دیسک است درحالی که مثال دوم برای خواندن از یک آدرس url است .
Stream Contexts
یک context در واقع استریم خاصی برای ست کردن پارامتر یا گزینه هایی برای ویرایش یا اضافه کردن یک سری عملکردها به wrapper ما است .
یکی از کاربرد های مهم استفاده از context برای ویرایش HTTP wrapper ها است .
برای عملیات ساده شبکه ای و کار با url به جای استفاده از کتابخانه cURL در php می توانیم از قابلیت Stream Contexts بهره ببریم .
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $opts = array( 'http'=>array( 'method'=>"POST", 'header'=> "Auth: SecretAuthTokenrn" . "Content-type: application/x-www-form-urlencodedrn" . "Content-length: " . strlen("Hello World"), 'content' => 'Hello World' ) ); $default = stream_context_get_default($opts); readfile('http://localhost/dev/streams/php_input.php'); |
اول از همه یک سری از گزینه ها (option) را تعریف کردیم . آرایه ای از آرایه ها با فرمت $array['wrapper']['option_name']
(گزینه هایcontext مورد نظر بر اساس wrapper ما می تواند بسیار متفاوت هم باشد .)
سپس تابع stream_context_get_default()
را فراخوانی کردیم که context پیش فرض را برگشت (return) می دهد و همچنین یک آرایه ای از آپشن ها را برای ست کردن دریافت می کند.
تابع readfile()
از این تنظیمات برای خواندن محتویات استفاده می کند .
در این مثال , محتویات در داخل قسمت بدنه درخواست (body of the request) ارسال می شود بنابراین اسکریت باید از php://input برای خواندن آن استفاده کند . همچنین میتوانیم از apache_request_headers()
برای خواندن هدرها بهره ببریم .
1 2 3 4 5 6 7 |
Array ( [Host] => localhost [Auth] => SecretAuthToken [Content-type] => application/x-www-form-urlencoded [Content-length] => 11 ) |
ما در کد php بالا آپشن های پیش فرض را تغییر دادیم که می توانیم یک از یک context جایگزین بصورت جداگانه نیز استفاده کنیم .
جمع بندی Stream wrapper در php
همانطور که دیدید , استریم ها , همه یا بعضی از توابع مرتبط با فایل سیستم را در اختیار ما قرار می دهند .
بنابراین اولین موردی که به ذهن میرسد این است که برای بعضی از فایل سیستم های مجازی مانند Heroku , AppFog که فایل سیستم واقعی ندارند می تواند قابل استفاده باشد .
همچنین بدون هیچ مشکلی می توانیم اپ های خودمان را از سرویس های هاستینگ استاندارد به سرویس های cloud پورت بدیم .
همانطور که می دانید سرور های تلگرام نیز برای ارایه api خود برای ساخت ربات تلگرام نیز از این Stream wrapper در php برای ارایه سرویس استفاده کردند که بسیار کاربری و مفید است .
همچنین یکی از کاربرهای مهم Stream wrapper در php استفاده از آن برای پخش ویدیو یا آهنگ بصورت آنلاین و لحظه ای است که این امکان را به ما میدهد بدون آنکه تمام ویدیو را کامل دانلود و بعد شروع به دیدن آن کنیم , می توانیم بصورت آنی و لحظه ای ویدیو را برای مخاطب پخش کنیم مانند سرویس های اشتراک ویدیوی youtube و aparat ,… .
امیدوارم از آموزش Stream wrapper در php نهایت استفاده رو برده باشید .
هر گونه مشکلی در پیاده سازی کدها داشتید ، از قسمت نظرات اقدام کنید . سریعا ، پاسخگوی سوالات شما هستیم .
موفق و پیروز باشید.
آقا توضیحاتتون عالی بود👏👏. واقعا دمتون گرم سايتتون مثل خودتون خیلی خوبه😉
حالا یه سوال بی ربط هم بپرسم 😂
شما api فیس اپ(تغییر چهره) رو به همراه مستنداتش دارید؟ هرچی سرچ میکنم api مایکروسافت رو میاره فقط
سلام . ممنونم لطف دارید . خوشحالم که مورد استفاده شما قرار گرفته .
sdk های خیلی متنوعی وجود داره که میتونید از اینجا https://www.npmjs.com/package/faceapp و گیت هاب مشاهده بفرمایید که به زبان های مختلف منتشر شده.
موفق باشید.
سلام من آدرس api فیس اپ رو به واسطه لینکی که شما دادید پیدا کردم اما نمیدونم چطوری ازش استفاده کنم
https://node-01.faceapp.io/api/v2.9/photos
این آدرسش هست اما متاسفانه داکیومنتش رو نتونستم پیدا کنم. اینو گذاشتم اینجا که اگر شما یا کاربران سایت بلد بودید به من هم اطلاع بدید که من هم استفاده کنم
راستی اینم یه نمونه کد جاوا اسکریپت(متاسفانه من js بلد نیستم) که اگر کسی js بلد باشه خیلی راحت میتونه لیست متد ها و پارامترهاشو بدست بیاره
https://github.com/lolPants/faceapp.js
اگر چیزی فهمیدید به منم اطلاع بدید. با تشکر 🙂