ویژگی تصویر

تابع stream_context_set_default() در PHP

  /  PHP   /  تابع stream_context_set_default() در PHP
بنر تبلیغاتی الف
آموزش PHP

تابع stream_context_set_default() در PHP راهی ساده و قدرتمند برای تعیین تنظیمات پیش‌فرض (default) برای جریان‌ها (streams) و پروتکل‌ها مانند http، ssl، ftp و غیره فراهم می‌کند. این تنظیمات پیش‌فرض در طول اجرای اسکریپت روی تمام توابعی که از streamها استفاده می‌کنند تاثیر می‌گذارند مگر اینکه صریحاً یک context متفاوت به آن‌ها داده شود.

چرا از stream_context_set_default() استفاده کنیم؟

  • تعیین headerها و timeoutهای سراسری برای درخواست‌های HTTP
  • تنظیم گزینه‌های SSL مثل مسیر فایل CA یا روشن/خاموش کردن بررسی peer
  • پیش‌فرض‌سازی گزینه‌ها برای کتابخانه‌ها یا کدهای ثالث که امکان ارسال context ندارند

سینتکس و پارامترها

سینتکس کلی تابع به صورت زیر است:

bool stream_context_set_default(array $options)

پارامتر $options آرایه‌ای دو بعدی است که کلید اول نام wrapper/protocol (مانند ‘http’ یا ‘ssl’) و کلیدهای داخلی گزینه‌ها را نشان می‌دهد.

مثال پایه: تنظیم هدر و timeout پیش‌فرض برای HTTP

stream_context_set_default([
    'http' => [
        'timeout' => 10,
        'header'  => "User-Agent: MyApp/1.0rnAccept: application/jsonrn"
    ]
]);

echo file_get_contents('http://example.com/api');

در این مثال، ما برای تمام درخواست‌های HTTP بدون context صریح، تاخیر (timeout) ۱۰ ثانیه و هدر User-Agent و Accept مشخص کرده‌ایم. بنابراین فراخوانی file_get_contents از این تنظیمات استفاده می‌کند.

نکته فنی در مورد ادغام تنظیمات (merging)

هر بار که stream_context_set_default فراخوانی شود، مقادیر جدید با مقادیر قبلی ادغام می‌شوند و اگر کلید یکسانی وجود داشته باشد، مقدار جدید جایگزین می‌شود. بنابراین می‌توان به صورت تدریجی پیش‌فرض‌ها را در طول اسکریپت تنظیم یا به‌روزرسانی کرد.

مثال: پیکربندی SSL — هشدار امنیتی

stream_context_set_default([
    'ssl' => [
        'verify_peer'      => false,
        'verify_peer_name' => false,
    ]
]);

$data = file_get_contents('https://example.com');

این مثال بررسی‌های امنیتی SSL را غیرفعال می‌کند که از منظر امنیتی بسیار خطرناک است — به‌ویژه در محیط‌های تولید. این کار ممکن است به حملات man-in-the-middle منجر شود. به‌جای این کار از CA bundle معتبر استفاده کنید:

stream_context_set_default([
    'ssl' => [
        'verify_peer'      => true,
        'verify_peer_name' => true,
        'allow_self_signed'=> false,
        'cafile'           => '/path/to/ca-bundle.crt'
    ]
]);

در نسخه امن‌تر، بررسی همتای SSL روشن است و مسیر فایل CA مشخص شده تا گواهی‌ها بر اساس مجموعه قابل اعتماد اعتبارسنجی شوند.

مثال حرفه‌ای: استفاده امن و محلی (به جای تغییر سراسری)

$ctx = stream_context_create([
    'http' => [
        'timeout' => 5,
        'header' => "User-Agent: MyApp/1.0rn"
    ],
    'ssl' => [
        'verify_peer' => true,
        'cafile'      => '/path/to/ca-bundle.crt'
    ]
]);

echo file_get_contents('https://api.example.com/data', false, $ctx);

این شیوه بهتر است چون context فقط برای همان فراخوانی اعمال می‌شود و از اثرات جانبی روی سایر بخش‌های برنامه جلوگیری می‌کند. توصیه می‌شود هر زمان امکان داشت از stream_context_create و ارسال context به تابع استفاده کنید تا از دستکاری سراسری جلوگیری شود.

زمان مناسب برای استفاده از stream_context_set_default()

  • وقتی می‌خواهید تنظیمات مشترکی را برای کل اسکریپت یا فرامین کتابخانه‌ای که قابل تغییر نیستند اعمال کنید.
  • در اسکریپت‌های خط فرمان کوتاه یا زمانی که کنترل کامل بر جریان‌ها دارید.
  • برای تنظیم CA bundle یا timeout عمومی در اپلیکیشن‌هایی که فراخوانی‌های متعددی به منابع خارجی دارند.

معایب و خطرات

  • تأثیر سراسری: هر تغییر روی تمام توابعی که از streamها استفاده می‌کنند اعمال می‌شود و ممکن است موجب رفتار غیرمنتظره در کتابخانه‌ها شود.
  • ریسک امنیتی در صورت غیرفعال کردن verify_peer یا تنظیمات ناامن دیگر.
  • مشکل در اشکال‌زدایی: پیدا کردن اینکه کدام بخش تنظیمات پیش‌فرض را تغییر داده ممکن است دشوار باشد.

جدول گزینه‌های متداول برای پروتکل‌ها

پروتکلکلید/گزینهتوضیح
httptimeoutحداکثر زمان انتظار برای پاسخ (ثانیه)
httpheaderهدرهای HTTP به صورت رشته
sslverify_peerفعال/غیرفعال کردن بررسی گواهی سرور
sslcafileمسیر به فایل bundle از گواهی‌های CA معتبر
ftpoverwriteگزینه‌های مرتبط با آپلود/دانلود FTP

نکات بهینه‌سازی و توصیه‌های حرفه‌ای

  • هرگاه ممکن است از context محلی (stream_context_create) استفاده کنید تا از اثرات جانبی جلوگیری شود.
  • برای تایم‌اوت‌ها مقادیر منطقی انتخاب کنید تا منابع آزاد شوند و بلاک‌های طولانی رخ ندهد.
  • هدر User-Agent را مشخص کنید تا برخی سرورها درخواست‌های بدون UA را مسدود نکنند.
  • هرگز verify_peer را در محیط تولید غیرفعال نکنید؛ به جای آن مسیر CA معتبر تعیین کنید.
  • اگر از چارچوب‌ها یا کتابخانه‌های ثالث استفاده می‌کنید، مستندات آنان را برای هماهنگی با تنظیمات سراسری بررسی کنید.

خلاصه کوتاه

تابع stream_context_set_default ابزار مفیدی برای تنظیم تنظیمات پیش‌فرض streamها در PHP است و در سناریوهای معلوم کاربردی و صرفه‌جویی در تکرار را فراهم می‌کند. با این حال، به دلیل اثر سراسری آن باید با احتیاط استفاده شود و در بیشتر موارد استفاده از context محلی ترجیح داده می‌شود. در مسائل امنیتی خصوصاً برای ssl، همواره از روش‌های امن (verify_peer=true و cafile معتبر) استفاده کنید.

آیا این مطلب برای شما مفید بود ؟

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