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

文章目录
    分类:PHP 标签:PHP基础

    PHP中的网络组件相关函数

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

    获取服务器相关信息

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

    主机 DNS 信息

    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 的结果。

    $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 信息。

    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 地址。


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

    var_dump(gethostname()); // string(27) "zhangyuedeMacBook-Pro.local"

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

    IP 地址转换

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

    var_dump(ip2long('127.0.0.1')); // int(2130706433)
    var_dump(long2ip(2130706433)); // string(9) "127.0.0.1"

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

    协议端口相关信息

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

    var_dump(getprotobyname("tcp")); // int(6)
    var_dump(getprotobynumber(6)); // string(3) "tcp"

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

    $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 。

    // 获取当前状态码,并设置新的状态码
    var_dump(http_response_code(404)); //  int(200)
    
    //获取新的状态码
    var_dump(http_response_code()); //  int(404)

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

    头信息设置

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

    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 这个简单服务器命令自带的一个头信息。


    //img1.zyblog.com.cn/20240521/889c307f5dc4fddf82df4c4e0a3031a2.png

    两种不同的 Cookie 函数

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

    setcookie("CK_TEST1", "Cookie1=?---&&f");
    setrawcookie("CK_TEST1", "Cookie2=?---&&f");

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


    //img1.zyblog.com.cn/20240521/035e320df7391b76361d82363f091757.png

    总结

    在官方文档中的网络相关的扩展函数就是这些了,当然,还有一个大头我们没有介绍,那就是 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

    视频链接

    微信文章地址:https://mp.weixin.qq.com/s/EV1JGwLs0sEfRywx75I9Cw

    搜索
    关注