V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xxbutoo
V2EX  ›  Java

想用 PHP 实现个批量检测域名是否被墙的功能

  •  
  •   xxbutoo · 2019-12-23 14:42:47 +08:00 · 4497 次点击
    这是一个创建于 1825 天前的主题,其中的信息可能已经有所发展或是发生改变。

    正在做一个域名检测是否被墙功能

    有提供 类似这种网址的 00738.com 开放 api 或者思路的大佬加下我 有偿酬谢

    12 条回复    2019-12-23 17:13:56 +08:00
    chendy
        1
    chendy  
       2019-12-23 14:49:20 +08:00
    想用 PHP 做,为啥放到了 Java 下…
    xxbutoo
        2
    xxbutoo  
    OP
       2019-12-23 14:50:38 +08:00
    @chendy 不好意思老哥 因为比较急 所以就乱投医了
    不知道能不能改。。
    xxbutoo
        3
    xxbutoo  
    OP
       2019-12-23 15:07:44 +08:00
    <?php
    require_once __DIR__ . '/vendor/autoload.php';

    use GuzzleHttp\Client;
    use GuzzleHttp\Exception\ConnectException;

    $client = new Client();
    try {
    $client->get('www.qq.com', ['timeout' => 7]);
    $client->get('www.google.com', ['timeout' => 7]);
    $client->get('www.baidu.com', ['timeout' => 7]);
    } catch (ConnectException $e) {
    echo '被墙了';
    }


    这是我目前实现的思路
    sunznx
        4
    sunznx  
       2019-12-23 15:13:44 +08:00
    看起来不行,用 nodejs 或者 swoole 来实现更合适?
    shintendo
        5
    shintendo  
       2019-12-23 15:18:13 +08:00
    没看懂,检测被墙不是应该从境内主机和境外主机分别连接检测目标吗?
    FaceBug
        6
    FaceBug  
       2019-12-23 15:34:38 +08:00
    要分别从国内和国外各测试一份结果
    国内不行,国外 OK 才是被墙

    另外结合网上的资料,给你优化了一份,这个我之前项目也有用到,你上面发的只能判断 HTTP 服务

    <?php

    function checkGfw($domainList, $timeout = 3)
    {
    $res = [];
    foreach ($domainList as $domian) {
    $domainArr = explode(':', $domian);
    if (!isset($domainArr[1])) { //没有写端口则指定为 80
    $domainArr[1] = '80';
    }
    $res[$domian] = socketTest($domainArr,$timeout);
    }
    return $res;

    }

    function socketTest($domainArr, $timeout)
    {
    $start = time();

    $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

    socket_set_nonblock($sock);

    $res = false;

    while (!@socket_connect($sock, $domainArr[0], $domainArr[1])) {
    $err = socket_last_error($sock);

    if ($err === 56) {
    socket_close($sock);
    $res = true;
    break;
    }

    if ((time() - $start) >= $timeout) {
    socket_close($sock);
    $res = false;
    break;
    }
    usleep(250000);
    }

    // socket_set_block($sock);
    return $res;
    }

    $domainList = [
    'www.baidu.com',
    'www.google.com',
    'www.hao123.com:8099'
    ];
    $res = checkGfw($domainList);

    var_dump($res);
    FaceBug
        7
    FaceBug  
       2019-12-23 15:36:01 +08:00
    并发的问题自己另外琢磨下吧,我这个没弄并发的事情
    nimab
        8
    nimab  
       2019-12-23 15:40:49 +08:00
    public function ping() {
    $host = "www.baidu.com";
    $port = 80;
    $timeout = 5;
    $tB = microtime(true);
    $fP = fSockOpen($host, $port, $errno, $errstr, $timeout);
    if (!$fP) {
    var_dump($errno."return: ".$fP);
    return false;
    }
    $tA = microtime(true);
    print_r (round((($tA - $tB) * 1000), 0)." ms");
    }
    }
    xxbutoo
        9
    xxbutoo  
    OP
       2019-12-23 16:30:28 +08:00
    @cepczkd 非常感谢您
    可以加我 q 吗 (base64)
    OTU3NDc5MjQ1

    封个小小的利是
    xxbutoo
        10
    xxbutoo  
    OP
       2019-12-23 16:32:50 +08:00
    @nimab
    可以加我 q 吗 (base64)
    OTU3NDc5MjQ1

    封个小小的利是
    FaceBug
        11
    FaceBug  
       2019-12-23 17:04:27 +08:00
    @xxbutoo 没事,不用了,我也是半抄的
    runtu2019
        12
    runtu2019  
       2019-12-23 17:13:56 +08:00 via Android
    用 curl 就行,被墙了 curl 会返回一个很常规的错误码具体是哪个我忘了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2853 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 07:26 · PVG 15:26 · LAX 23:26 · JFK 02:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.