ویژگی تصویر

تابع stream_context_set_options() در PHP

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

تابع stream_context_set_options() یکی از ابزارهای مهم در کار با stream context در PHP است. این تابع به شما اجازه می‌دهد مجموعه‌ای از گزینه‌ها (options) را به صورت دسته‌ای روی یک context اعمال کنید تا رفتار فراخوانی‌های مبتنی بر stream مثل file_get_contents، fopen یا سایر توابع شبکه‌ای تغییر کند.

موقعیت و نقش در اکوسیستم stream

در PHP، مفهوم «context» برای پیکربندی رفتار wrapperها (مانند http، ftp، ssl و … ) و streamها طراحی شده است. توابع مرتبط معمولاً شامل موارد زیر هستند:

  • stream_context_create — ایجاد یک context جدید از طریق آرایه گزینه‌ها
  • stream_context_set_option — تنظیم یک گزینه منفرد
  • stream_context_set_options — تنظیم چندین گزینه به صورت دسته‌ای (این مبحث)
  • stream_context_get_options — بازیابی گزینه‌های فعلی
  • stream_context_set_params — تنظیم پارامترهای اضافی مثل timeout یا دیگر پارامترهای سطح stream

امضای تابع و پارامترها

ایمپلیمونتیشن رایج تابع به این صورت است:

$result = stream_context_set_options(resource $stream_or_context, array $options);

پارامترها:

  • $stream_or_context: یا resource ای که همان context است یا stream ای که قابل تبدیل به context می‌باشد.
  • $options: آرایه‌ای چندبعدی که کلیدهای آن اسامی wrapperها (مثلاً “http” یا “ssl”) و مقدار هر کلید به صورت آرایه‌ای از گزینه‌هاست.

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

نمونه‌های عملی و کاربردها

مثال 1: تغییر هدرها و متد برای درخواست HTTP

$context = stream_context_create();

$options = [
    'http' => [
        'method'  => 'POST',
        'header'  => "Content-Type: application/jsonrnAccept: application/jsonrn",
        'content' => json_encode(['foo' => 'bar'])
    ]
];

stream_context_set_options($context, $options);

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

توضیح: در این مثال ابتدا یک context ایجاد کرده‌ایم سپس با stream_context_set_options چند گزینه HTTP را (شامل متد POST، هدرها و بدنه JSON) به صورت دسته‌ای اعمال می‌کنیم. سپس از file_get_contents با آن context برای ارسال درخواست استفاده شده است.

مثال 2: تنظیم گزینه‌های SSL (امنیت اتصال)

$context = stream_context_create();

$options = [
    'ssl' => [
        'verify_peer'       => true,
        'verify_peer_name'  => true,
        'allow_self_signed' => false,
        'cafile'            => '/etc/ssl/certs/ca-certificates.crt',
        'local_cert'        => '/path/to/client-cert.pem'
    ]
];

stream_context_set_options($context, $options);

$content = file_get_contents('https://secure.example.com/', false, $context);

توضیح: این نمونه تنظیمات مربوط به SSL/TLS را نشان می‌دهد که برای ارتباطات امن ضروری است. توجه داشته باشید که غیرفعال کردن verify_peer یا allow_self_signed=true فقط در محیط تست توصیه می‌شود؛ در تولید باید اعتبارسنجی گواهی انجام شود.

مثال 3: استفاده برای چند درخواست و بهبود کارایی

$context = stream_context_create([
    'http' => ['header' => "User-Agent: MyAgent/1.0rn"]
]);

// اعمال گزینه‌های بیشتر به صورت دسته‌ای
stream_context_set_options($context, [
    'http' => ['timeout' => 10] // بعضی wrapperها ممکن است این گزینه را قبول کنند
]);

$data1 = file_get_contents('http://example.com/1', false, $context);
$data2 = file_get_contents('http://example.com/2', false, $context);

توضیح: با ایجاد و پیکربندی یک context واحد و استفاده مجدد از آن در چند درخواست، از تکرار کار جلوگیری و کارایی را افزایش می‌دهیم. این تکنیک برای ارسال هدرهای ثابت یا استفاده از اتصالات TCP/HTTP مداوم مفید است.

نکات و هشدارهای امنیتی و کاربردی

  • هرگز verify_peer را در محیط تولید غیرفعال نکنید مگر اینکه دلیل روشنی برای آن وجود داشته باشد؛ غیرفعال کردن اعتبارسنجی گواهی، اتصال را در برابر حملات MITM آسیب‌پذیر می‌کند.
  • اگر از client certificate استفاده می‌کنید، مسیر فایل‌ها و دسترسی‌ها (permissions) را به دقت تنظیم کنید تا کلید خصوصی محافظت شود.
  • استفاده از stream_context_set_options برای wrapperهای ناشناخته ممکن است بی‌تأثیر باشد؛ ابتدا مستندات wrapper موردنظر را بررسی کنید.
  • در صورت نیاز به تغییر یک گزینه منفرد، می‌توان از stream_context_set_option نیز استفاده کرد؛ هر دو عملکرد منطقی دارند اما set_options برای اعمال آرایه‌های بزرگتر مناسب‌تر است.

مقایسه توابع مرتبط

تابعکاربرد
stream_context_createایجاد context از ابتدا با آرایه گزینه‌ها
stream_context_set_optionتنظیم یک گزینه منفرد روی context
stream_context_set_optionsتنظیم چند گزینه به صورت دسته‌ای (موضوع این مقاله)
stream_context_get_optionsبازیابی آرایه گزینه‌های فعلی از context
stream_context_set_paramsتنظیم پارامترهای مربوط به stream مانند timeout یا notification

نکات تخصصی و بهینه‌سازی

  • برای بررسی گزینه‌های فعلی از stream_context_get_options استفاده کنید تا از وضعیت فعلی context مطلع شوید.
  • به خاطر داشته باشید برخی گزینه‌ها روی wrapper مشخصی اعمال می‌شوند؛ مثلاً گزینه‌های ssl تنها برای wrapperهای SSL معنادارند.
  • اگر مستقیماً از resource یک stream (مثلاً نتیجه fopen) استفاده می‌کنید، تابع stream_context_set_options گاهی اوقات context مرتبط با آن stream را تغییر می‌دهد؛ اما بهتر است ابتدا context مستقل بسازید و سپس آن را به توابع ارسال کنید.
  • برای عملیات با بار بالا، استفاده از context مشترک و نگهداری آن در حافظه می‌تواند باعث کاهش سربار اختصاصی و افزایش سرعت شود.

خلاصه و جمع‌بندی

تابع stream_context_set_options() ابزاری قدرتمند برای پیکربندی دسته‌ای گزینه‌های ارتباطی و streamها در PHP است. با استفاده هوشمندانه از آن می‌توان هدرها، پارامترهای SSL، رفتار wrapperها و دیگر ویژگی‌های اتصال را به شکل مرکزی مدیریت کرد. رعایت نکات امنیتی و آگاهی از گزینه‌های هر wrapper باعث می‌شود از این تابع بهترین نتیجه را بگیرید.

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

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