关于php:关于PHP中的请求上下文的相关知识

5次阅读

共计 2200 个字符,预计需要花费 6 分钟才能阅读完成。

咱们首先来理解下什么是上下文。在咱们写文章,写句子时,都会思考一个观点或者内容的前后逻辑,转承启合,而在这个观点前后的内容就能够看成是它的上下文内容。它蕴含了语境的象征在外面,其实代码世界中的上下文也是一样的意思,自身 Context 这个单词就是环境、背景的意思。

接下来,咱们来说说申请上下文又是什么呢?比如说咱们要应用 PHP 来申请一个链接地址,通常咱们会应用 curl 来进行申请,然而 curl 的配置其实是比较复杂的,所以咱们在简略应用的状况下会应用 file_get_contents() 这种函数来快捷地申请链接。不过,可能很多人并不知道或者说没怎么应用过它的上下文参数。其实,应用了上下文参数之后,file_get_contents() 不仅能够提交 POST 申请,还能够定义各种申请头内容。这些货色,就是一个申请的上下文,也就是它的执行环境和背景。

首先,咱们定义一个服务端,在这里只是输入 \$_GET 和 $_POST 外面的内容。同时,咱们还打印了 $_SERVER 来看看申请头是否获取到了。

print_r($_SERVER);

echo 'GET INFO', PHP_EOL;
foreach ($_GET as $k => $v) {echo $k, ':', $v, PHP_EOL;}

echo PHP_EOL,PHP_EOL;
echo 'POST INFO', PHP_EOL;
foreach ($_POST as $k => $v) {echo $k, ':', $v, PHP_EOL;}

接下来,在咱们的测试代码中,应用 file_get_contents() 来进行 POST 提交。

$postdata = http_build_query(
    [
        'var1' => 'some content',
        'var2' => 'doh',
    ]
);

$opts = [
    'http' => [
        'method' => 'POST',
        'header' => 'Content-type: application/x-www-form-urlencoded',
        'content' => $postdata,
    ],
];

$context = stream_context_create($opts);
$result = file_get_contents('http://localhost:8088/?a=1', false, $context);
print_r($result);
var_dump($http_response_header);

在这里,咱们只是用到了 stream_context_create(),就可能轻松地创立一个申请的上下文环境了。stream_context_create() 是创立上下文环境的函数,它接管的参数是一个选项数组,外面用于定义以后申请的相干选项。留神,咱们这里其实定义的是 http/https 相干的选项,它还能够定义 ftp、socket 等相干的申请协定选项。

在应用 file_get_contents() 函数申请近程地址后,咱们能够在 $http_response_header 变量内获取到申请返回的响应头信息。而且这个变量是会定义在以后的部分作用域下,不必放心全局作用域净化的问题。

非常简单的形式就能够实现 POST 申请了吧,另外咱们还能够应用 fopen() 函数来实现相似的成果,不过获取 body 和响应应信息时的形式就不同了。

$url = "http://localhost:8088/?a=1";

$opts = [
    'http' => [
        'method' => 'GET',
        'max_redirects' => '0',
        'ignore_errors' => '1',
    ],
];

$context = stream_context_create($opts);
$stream = fopen($url, 'r', false, $context);

// 返回响应头
var_dump(stream_get_meta_data($stream));

// 返回内容
var_dump(stream_get_contents($stream));
fclose($stream);

在这段代码中,咱们应用 stream_get_meta_data() 函数来取得响应头,应用 stream_get_contents() 来取得响应的内容(body)。这样其实就真的和 curl 的成果差不多了,而且最次要的是,以后这种写法更简略不便。

从下面的代码中咱们能够看出,这种上下文相干的函数都是 Stream 类型的函数,也就是流函数。它们是专门用来解决各种数据的,包含但不限于文件中的、网络上的、压缩文件以及其余一些操作的数据。在未来的学习中,咱们还会接触到其它的内容。明天的学习,其实是流的网络数据处理中的一小部分内容,大家先消化消化吧!

测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202003/source/%E5%85%B3%E4%BA%8EPHP%E4%B8%AD%E7%9A%84%E8%AF%B7%E6%B1%82%E4%B8%8A%E4%B8%8B%E6%96%87%E7%9A%84%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86.php

参考文档:

https://www.php.net/manual/zh/context.php

各自媒体平台均可搜寻【硬核项目经理】

正文完
 0