PHP stream_context_create

(PHP 4 = 4.3.0, PHP 5, PHP 7)

stream_context_create — Створює контекст потоку

Створює та повертає контекст потоку з опціями, зазначеними в масиві options .

Список параметрів

Має бути асоціативним масивом у форматі $arr['wrapper']['option'] = $value. Список доступних обгорток та опцій дивіться у розділі Опції контексту

Значення за замовчуванням – порожній масив.

Має бути асоціативним масивом у форматі $arr['parameter'] = $value. Зверніться до розділу Опції контексту за списком стандартних параметрів потоку.

Значення, що повертаються

Ресурс (resource) контексту потоку.

список змін

Версія Опис
5.3.0Доданий необов'язковий аргумент params.

Приклад #1 Використанняstream_context_create()

= array( 'http' =>array( 'method' => "GET" , 'header' => "Accept-language: en\r\n" . "Cookie: foo=bar\r" ) );

$context = stream_context_create ($opts);

/* Відправляє http-запит на домен www.example.com з додатковими заголовками, показаними вище */ $fp = fopen ( 'http://www.example.com' , 'r' , false , $ Context); fpassthru ($ fp); fclose ($ fp); ?>

Дивіться також

  • stream_context_set_option() - Встановлює опцію для потоку/обгортки/контексту
  • Список обгорток (підтримувані протоколи та обгортки)
  • Опції контексту (Контекстні опції та параметри)

User Contributed Notes 14 notes

Деякий час, коли творять SSL streams (за допомогою https://):

= context_create_stream ( $context_options ) $fp = fopen ( 'https://url' , 'r' ,false , $context ); ?> Можна подумати, що правильний спосіб створити масив параметрів потоку буде таким:

= array ( 'https' => масив ( 'method' => 'POST' , 'header' => "Content-type: application/x-www-form-urlencoded \r\n" . "Content-Length: " . strlen ( $data ). "\r\n" , 'content' => $data ) ); ?> ЦЕ НЕПРАВИЛЬНИЙ ШЛЯХ. Зверніть увагу на 3-й рядок: 'https' => масив (

ПРАВИЛЬНИЙ спосіб полягає в наступному:

= array ( 'http' => array ( 'method' => 'POST' , 'header' => "Content-type: application/x-www-form-urlencoded \r\n" . "Content-Length: " . strlen ( $data ). "\r\n" , 'content' => $data ) ); ?> Зверніть увагу, НОВИЙ 3-й рядок: 'http' => масив (

Тепер – майте це на увазі – я витратив кілька годин, намагаючись вирішити проблему, коли нарешті натрапив на цю незадокументовану проблему.

Повний код для розміщення на захищеній сторінці такий:

= array ( 'foo' => 'bar' , 'bar' => 'baz' ); $data = http_build_query ( $data );

$context_options = array ( 'http' => масив ( 'method' => 'POST' , 'header' => "Content-type: application/x-www-form -urlencoded\r\n" . "Content-Length: " . strlen ( $data ). "\r\n" , 'content' => $data ) ) ;

$context = context_create_stream ( $context_options ) $fp = fopen ('https://url', 'r', false, $context); ?>

Сподіваюся, що це комусь допоможе. У документації не згадується те, що коли php компілюється --with-curlwrappers,

= array( 'http' =>array( 'method' => "GET" , 'header' => "Accept-language: en\r\n" . "Cookie: foo=bar\r\n" ) );

$context = stream_context_create ( $opts ); ?> Ви б налаштували заголовок таким чином:

= array( 'http' =>array( 'method' => "GET" , 'header' =>array( "Accept-language: en" , " Cookie: foo=bar" , "Custom-Header: value" ) ) );

$context = stream_context_create ( $opts ); ?> Це спрацює.

Я витратив добрих п’ять годин, намагаючись зрозуміти це, тому, сподіваюся, це заощадить час ще комусь.

Проблема полягає в тому, що значення 'header' застосовне лише до http-з'єднань. Отже, для автентифікації на проксі-сервері вам спочатку потрібно отримати файл із HTTP, перш ніж контекст стане дійсним для використання на FTP. = array( 'ftp' => array( 'proxy' => 'tcp://vbinprst10:8080' , 'request_fulluri' => true , 'header' => array( "Проксі-авторизація: Basic $auth " ) ), 'http' => array( 'proxy' => 'tcp:/ /vbinprst10:8080' , 'request_fulluri' => true , 'header' => array( "Проксі-авторизація: Basic $auth " ) ) ); $context = stream_context_create ( $opts ); $s = file_get_contents ("http://www.example.com", false, $context); $s = file_get_contents ( "ftp://anonymous:[email protected]" , false , $context ); ?> Це трохи обхідне, але працює. Зауважте, що значення «заголовка» в масиві ftp зайве, але я все одно його залишив.

Я виявив, що наступний код спрацював для мене для POST деяких двійкових даних на віддалений сервер. Я розміщую це тут, оскільки я не міг знайти швидке вирішення цієї проблеми, «гугливши» або переглядаючи цю документацію.