stream_context_create

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

stream_context_create创建流上下文

描述

stream_context_create(?array $options = null, ?array $params = null): resource

创建并返回一个流上下文,其中任何在 options 中提供的选项都已预设。

参数

options

必须是关联数组的关联数组,格式为 $arr['wrapper']['option'] = $value,或 null。有关可用包装器和选项的列表,请参阅 上下文选项

默认为 null

params

必须是关联数组,格式为 $arr['parameter'] = $value,或 null。有关标准流参数的列表,请参阅 上下文参数

返回值

一个流上下文 resource

变更日志

版本 描述
8.0.0 optionsparams 现在可以为空。

示例

示例 #1 使用 stream_context_create()

<?php
$opts
= [
'http' => [
'method' => "GET",
// 使用换行符 \n 分隔多个标头
'header' => "Accept-language: en\nCookie: foo=bar",
]
];

$context = stream_context_create($opts);

/* 向 www.example.com 发送 http 请求
并带有上面显示的附加标头 */
$fp = fopen('http://www.example.com', 'r', false, $context);
fpassthru($fp);
fclose($fp);
?>

参见

添加备注

用户贡献的备注 15 则备注

jrubenstein at gmail dot com
17 年前
创建 SSL 流时需要记住的一点(使用 https://

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

有人可能会认为 - 创建流选项数组的正确方法应该是:

<?php
$context_options
= array (
'https' => array (
'method' => 'POST',
'header'=> "Content-type: application/x-www-form-urlencoded\r\n"
. "Content-Length: " . strlen($data) . "\r\n",
'content' => $data
)
);
?>

那是错误的方式!
请注意第三行:'https' => array (

正确的方式如下:

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

请注意新的第三行:'http' => array (

现在 - 请记住 - 我花了几个小时试图解决我的问题,最后才偶然发现了这个没有记录的问题。

将数据发布到安全页面的完整代码如下:

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

$context_options = array (
'http' => array (
'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);
?>
contact (at) thepointsolution.com
14 年前
我有一个重要的说明,希望能帮助到某些人。文档中没有提到的一点是,当 php 使用 --with-curlwrappers 编译时,

因此,您无需使用

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

$context = stream_context_create($opts);
?>

您应该按这种方式设置标头

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

$context = stream_context_create($opts);
?>

这将起作用。
net_navard at yahoo dot com
18 年前
您好,您可以创建一个参数数组(称为流上下文),它可以在您通过套接字读取或写入流时进行传输。在以下示例中

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

您实际上是在创建一组参数(要使用的协议、请求方法、额外的 HTTP 标头和 cookie),这些参数将在您每次打开套接字连接以请求 www.example.com 时使用。如果您想在每次请求 www.example.com 时使用这些参数(称为流上下文),而不是一遍又一遍地指定它们,这将节省大量时间。
使用前面的示例,假设您想创建一个流上下文,它发送一个 "Content-Type" HTTP 标头并在请求 www.example.com 时使用它。请看

$opts = array('http'=>array('method'=>"GET",
'header'=>"Content-Type: text/xml; charset=utf-8");

$context = stream_context_create($opts);
$fp = fopen('http://www.example.com','r',false,$context);
fpassthru($fp);
fclose($fp);

现在,当您向 www.example.com 发出请求时,上述 HTTP 标头将包含在套接字中并传输到服务器。祝您朋友们好运,Hossein
davep at atomicdroplet dot com
17 年前
除了上面提到的上下文选项(附录 N)之外,套接字的上下文选项可以在附录 P 中找到 - https://php.net/manual/en/transports.php
Ben J
11 年前
我花了整整五个小时试图弄清楚这一点,所以希望它能为其他人节省一些时间。

当您尝试通过 HTTP 代理通过 FTP 下载文件时,请注意以下内容将不足够
<?php
$opts
= array('ftp' => array(
'proxy' => 'tcp://vbinprst10:8080',
'request_fulluri'=>true,
'header' => array(
"Proxy-Authorization: Basic $auth"
)
)
);
$context = stream_context_create($opts);
$s = file_get_contents("ftp://anonymous:[email protected]",false,$context);
?>

您的代理将响应需要身份验证。您可能会挠头,并想:“但我正在提供身份验证!”

问题是 'header' 值仅适用于 http 连接。因此,要在代理上进行身份验证,您必须先从 HTTP 中提取文件,然后上下文才能用于 FTP。
<?php
$opts
= array('ftp' => array(
'proxy' => 'tcp://vbinprst10:8080',
'request_fulluri'=>true,
'header' => array(
"Proxy-Authorization: Basic $auth"
)
),
'http' => array(
'proxy' => 'tcp://vbinprst10:8080',
'request_fulluri'=>true,
'header' => array(
"Proxy-Authorization: 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 数组中的 'header' 值是多余的,但我还是保留了它。
LANGE.LUDO
2 年前
要打开 HTTPS 流,我只能使用 HTTP 和 SSL 上下文选项来实现。

因此类似于
<?php
$postdata
= http_build_query(
array(
'var1' => 'some content',
'var2' => 'doh'
)
);

$opts = array(
'ssl' => array(
'verify_peer' => false,
'verify_peername' => false
// Ideally use instead
// 'cafile' => 'path Certificate Authority file on local filesystem'
),
'http' => array(
'method' => 'POST',
'header' =>
'Content-type: application/x-www-form-urlencoded'."\r\n".
''
'content'
=> $postdata
)
);

$context = stream_context_create($opts);

$result = file_get_contents('https://example.com/submit.php', false, $context);

// A good friend when it fails:
var_dump($http_response_header);

?>
louis dot huppenbauer at gmail dot com
11 年前
使用 https 协议时,您必须确保设置正确的上下文选项以利用 ssl/tls 加密的全部“功能”。

<?php
$url
= 'https://secure.example.com/test/1';
$contextOptions = array(
'ssl' => array(
'verify_peer' => true,
'cafile' => __DIR__ . '/cacert.pem',
'verify_depth' => 5,
'CN_match' => 'secure.example.com'
)
);
$sslContext = stream_context_create($contextOptions);
$result = file_get_contents($url, NULL, $sslContext);
?>

有关这些上下文选项的更多信息,请访问 https://php.net/manual/en/context.ssl.php
rlintern at gmail dot com
15 年前
我发现以下代码对我有用,用于将一些二进制数据 POST 到远程服务器。我在这里发布它,因为我没有通过“谷歌”或查看本文档找到一个快速解决方案。

免责声明:我不知道这是否是“好的”解决方案,因为我是 PHP 新手,但它可能正好满足您的需求,就像它满足我的需求一样。我假设对于非常大的文件会发生不好的事情,因为整个文件被读入 $fileContents 中。

我使用的是 PHP 5.2.8。

$fileHandle = fopen("someImage.jpg", "rb");
$fileContents = stream_get_contents($fileHandle);
fclose($fileHandle);

$params = array(
'http' => array
(
'method' => 'POST',
'header'=>"Content-Type: multipart/form-data\r\n",
'content' => $fileContents
)
);
$url = "http://somesite.somecompany.com?someParam=someValue";
$ctx = stream_context_create($params);
$fp = fopen($url, 'rb', false, $ctx);

$response = stream_get_contents($fp);
Andi
9 年前
不要尝试重复使用 stream_context_create 返回的资源。使用 https 连接到不同域时,它似乎不起作用。
Brian Gottier
15 年前
在某些情况下,根据服务器配置,将标头选项设置为数组,而不是字符串。

<?php
$opts
= array(
'http'=> array(
'method'=> "GET",
'header'=> array( "Cookie: foo="bar"l ),
'user_agent'=>
$_SERVER['HTTP_USER_AGENT']
)
);
?>
chris dot vigelius at gmx dot net
17 年前
似乎“php at charlesconsulting dot com”下面给出的授权示例不适用于 PHP 5.2.1,因为如果 'header' 选项不是数组(而是字符串),它将被简单地忽略。

以下内容有效
$url = 'http://protectedstuff.com';
$auth = base64_encode('user:password');
$header = array("Authorization: Basic $auth");
$opts = array( 'http' => array ('method'=>'GET',
'header'=>$header));
$ctx = stream_context_create($opts);
file_get_contents($url,false,$ctx);

另请参见 http://bugs.php.net/bug.php?id=41051
mathieu dot laurent at gmail dot com
15 年前
通过代理连接

<?php

$opts
= array('http' => array('proxy' => 'tcp://127.0.0.1:8080', 'request_fulluri' => true));
$context = stream_context_create($opts);

$data = file_get_contents('https://php.net', false, $context);

echo
$data;

?>
sp0n9e at gmail dot com
17 年前
这是一个非常简单的方法,无需使用cURL或手动编写http请求,即可轻松地进行POST请求。我喜欢使用上下文,仅仅是因为它们无处不在,并且缺少像cURL这样的可选库(尽管它是更流行的库之一)。

<?php

$options
= array(
'http'=>array(
'method'=>"POST",
'header'=>
"Accept-language: en\r\n".
"Content-type: application/x-www-form-urlencoded\r\n",
'content'=>http_build_query(array('foo'=>'bar'))
));

$context = stream_context_create($options);

fopen('http://www.example.com/',false,$context);

?>
Anonymous
13年前
如果您尝试在php 5.2.x上设置自定义http标头,请尝试以下操作

<?php
// 构建标头并以通常的方式设置它
$authenticationHeader = $headername . ': ' . $headervalue;
$opts = array(
'http' => array(
'header' => $authenticationHeader
)
);
// 用于修复php bug的解决方法,在php 5.2中不会发送http标头
if(version_compare(PHP_VERSION, '5.3.0') == -1){
ini_set('user_agent', 'PHP-SOAP/' . PHP_VERSION . "\r\n" . $authenticationHeader);
}

$context = stream_context_create($opts);

// 现在使用上下文进行soap调用或其他操作...
?>

这是唯一对我有用的选项。
php at charlesconsulting dot com
17 年前
以下是如何检索使用基本授权方案请求用户名和密码的页面的示例。这将调用w3.org网页验证器来验证受密码保护的页面。
//$fileurl包含要验证的页面
$validateurl="http://validator.w3.org/check?uri=$fileurl";

$cred = sprintf('Authorization: Basic %s',
base64_encode('username:password') );
$opts = array(
'http'=>array(
'method'=>'GET',
'header'=>$cred)
);
$ctx = stream_context_create($opts);

$validate=file_get_contents($validateurl,false,$ctx);
To Top