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 деяких двійкових даних на віддалений сервер. Я розміщую це тут, оскільки я не міг знайти швидке вирішення цієї проблеми, «гугливши» або переглядаючи цю документацію.