前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【PHP小课堂】PHP中的网络组件相关函数

【PHP小课堂】PHP中的网络组件相关函数

作者头像
硬核项目经理
发布2024-05-31 20:17:14
660
发布2024-05-31 20:17:14
举报

PHP中的网络组件相关函数

作为一门以 WEB 开发为主战场的编程语言来说,PHP 即使是在目前这个大环境下,依然也是 WEB 领域的头号玩家。我们在网络相关的功能中也提供了许多方便好用的函数组件,而且它们都是不需要安装扩展就能够使用的。今天,我们就来学习了解一下。

获取服务器相关信息

首先就是获取一些服务器相关信息的能力。主要包括 DNS 以及 IP 相关的功能函数的使用。

主机 DNS 信息

代码语言:javascript
复制
var_dump(checkdnsrr("www.baidu.com", "A")); // bool(true)

var_dump(checkdnsrr("max.baidu.com", "A")); // bool(false)

var_dump(checkdnsrr("mail.baidu.com")); // bool(true)

通过这个 checkdnsrr() 函数,我们可以获取某个域名的解析情况。它的第二个参数默认是 MX ,也就是邮件域名的解析,当然我们也可以指定 A 、TXT 这些解析内容。返回的就是是否有这个解析,也就是 true 或者 false 的结果。

代码语言:javascript
复制
$mxhosts = [];
getmxrr("baidu.com", $mxhosts);
var_dump($mxhosts);
// array(5) {
//     [0]=>
//     string(15) "mx.n.shifen.com"
//     [1]=>
//     string(14) "mx50.baidu.com"
//     [2]=>
//     string(13) "mx1.baidu.com"
//     [3]=>
//     string(14) "jpmx.baidu.com"
//     [4]=>
//     string(19) "mx.maillb.baidu.com"
//   }

var_dump(dns_get_record("baidu.com"));
// array(5) {
//     [0]=>
//     array(6) {
//       ["host"]=>
//       string(9) "baidu.com"
//       ["class"]=>
//       string(2) "IN"
//       ["ttl"]=>
//       int(4502)
//       ["type"]=>
//       string(2) "MX"
// …………………………
// …………………………
// …………………………
// …………………………

通过 getmxrr() 函数,可以获得这个域名下面的所有 MX 解析记录情况。dns_get_record() 则是获取域名的解析信息数组,它的内容会更加的详细清晰一些。

主机 IP 信息

一般要查看某个域名的解析对应 IP ,我们可以通过系统的 PING 命令来快速查看,而在 PHP 中,也有对应的函数可以获得某个域名指向的主机 IP 信息。

代码语言:javascript
复制
var_dump(gethostbyname("www.baidu.com")); // string(15) "183.232.231.174"
var_dump(gethostbyaddr("183.232.231.174")); // string(9) "localhost"

var_dump(gethostbynamel("www.baidu.com"));
// array(2) {
//     [0]=>
//     string(15) "183.232.231.174"
//     [1]=>
//     string(15) "183.232.231.172"
//   }

gethostbyname() 是根据域名可以获得域名指向的主机的 IP 地址,当然对于百度来说,这个可能是它的一个分发的站点IP。而 gethostbyaddr() 则是根据 IP 地址获得域名信息,这个功能相对来说没那么好用,比如我这里返回的都是 localhost 。

gethostbynamel() 函数获取到的是对应域名的所有指向的 IP 地址,可以看到返回的是两个 IP 地址。

另外,我们也可以获得本机的主机名。

代码语言:javascript
复制
var_dump(gethostname()); // string(27) "zhangyuedeMacBook-Pro.local"

这个函数是不需要任何参数的,直接返回的就是当前运行脚本的本机信息。

IP 地址转换

对于 IP 地址转换,也就是将 IP 地址转换成十进制的数字类型。

代码语言:javascript
复制
var_dump(ip2long('127.0.0.1')); // int(2130706433)
var_dump(long2ip(2130706433)); // string(9) "127.0.0.1"

ip2long() 是从 IP 地址转换为长整型,而 long2ip() 就是反过来,从长整型转换为 IP 地址格式。

协议端口相关信息

首先我们来看一下协议编号。

代码语言:javascript
复制
var_dump(getprotobyname("tcp")); // int(6)
var_dump(getprotobynumber(6)); // string(3) "tcp"

getprotobyname() 用于根据协议名来获取协议的编号,而 getprotobynumber() 也是它的反函数,从协议编号获得协议名称。

代码语言:javascript
复制
$services = array('http', 'ftp', 'ssh', 'telnet', 'imap',
'smtp', 'nicname', 'gopher', 'finger', 'pop3', 'www');

foreach ($services as $service) {
    $port = getservbyname($service, 'tcp');
    echo $service . ": " . $port, PHP_EOL;
}
// http: 80
// ftp: 21
// ssh: 22
// telnet: 23
// imap: 143
// smtp: 25
// nicname: 43
// gopher: 70
// finger: 79
// pop3: 110
// www: 80

var_dump(getservbyport(80, 'tcp')); // string(4) "http"

同样地,getservbyname() 是根据协议的名称获取它的默认端口号,而 getservbyport() 则是根据端口号和网络层协议名称来获得应用层的协议信息。这两个函数都是和应用层的这些服务器软件默认端口号相关的。

返回数据信息

接下来,我们来看一些和请求响应数据有关的函数。要使用这些函数的话,就需要启动应用服务了,也就是我们需要使用浏览器来访问了。这里,我们就简单地使用 php -S 来直接启动简易服务器进行测试。

状态码设置

这里的状态码主要指的就是响应的状态码。默认情况下,我们正常输出就是 200 ,在这里,我们将状态码改为 404 。

代码语言:javascript
复制
// 获取当前状态码,并设置新的状态码
var_dump(http_response_code(404)); //  int(200)

//获取新的状态码
var_dump(http_response_code()); //  int(404)

当然,这样的修改并不会影响我们的输出,但是在浏览器中查看请求的时候,对应的这个请求就会变红了,因为状态码是有问题的 404 状态码了。http_response_code() 的返回值是当前的状态码,如果给了参数的话,就会设置成新的状态码。

头信息设置

头信息设置的函数 header() 相信大家还是比较常用的。比如现在做前后端分离的应用时,使用 CROS 来解决跨域问题的时候多少都会用到这个函数。所以它不是我们今天学习的重点,我们今天要了解的东西是另外一些和头信息相关的函数。

代码语言:javascript
复制
header("Test1: Info1");
header("Test2: Info2");
header("Test3: Info3");

header_remove("Test2");

var_dump(headers_list());
// array(3) {
//     [0]=>
//     string(23) "X-Powered-By: PHP/7.3.9"
//     [1]=>
//     string(12) "Test1: Info1"
//     [2]=>
//     string(12) "Test3: Info3"
//   }

使用 header() 函数设置了头信息之后,如果不想要了,那么我们可以通过 header_remove() 来删除之前定义的头信息内容。而 headers_list() 则会显示我们或者 PHP 程序中额外添加的头信息内容,比如 X-Powered-By 这个信息是默认情况下 php -S 这个简单服务器命令自带的一个头信息。

两种不同的 Cookie 函数

cookie 相关操作的函数其实也不用多介绍,但是其实是有两种设置 cookie 的函数的。

代码语言:javascript
复制
setcookie("CK_TEST1", "Cookie1=?---&&f");
setrawcookie("CK_TEST1", "Cookie2=?---&&f");

知道它们两个的区别吗?就像下图所示的一样,setcookie() 会默认对数据内容进行 urlencode() 编码,而 setrawcookie() 就像它的名称一样,设置的数据是原始的形式。

总结

在官方文档中的网络相关的扩展函数就是这些了,当然,还有一个大头我们没有介绍,那就是 socket 相关的内容。这方面的内容我们将在后面专门学习 socket 相关的系列文章中再进行详细的学习说明。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/2021/03/source/2.PHP%E4%B8%AD%E7%9A%84%E7%BD%91%E7%BB%9C%E7%BB%84%E4%BB%B6%E7%9B%B8%E5%85%B3%E5%87%BD%E6%95%B0.php

参考文档:

https://www.php.net/manual/zh/book.network.php

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农老张 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PHP中的网络组件相关函数
    • 获取服务器相关信息
      • 主机 DNS 信息
      • 主机 IP 信息
      • IP 地址转换
    • 协议端口相关信息
      • 返回数据信息
        • 状态码设置
        • 头信息设置
        • 两种不同的 Cookie 函数
      • 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档