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

2019-12-23 14:42:47 +08:00
 xxbutoo

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

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

4354 次点击
所在节点    Java
12 条回复
chendy
2019-12-23 14:49:20 +08:00
想用 PHP 做,为啥放到了 Java 下…
xxbutoo
2019-12-23 14:50:38 +08:00
@chendy 不好意思老哥 因为比较急 所以就乱投医了
不知道能不能改。。
xxbutoo
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
2019-12-23 15:13:44 +08:00
看起来不行,用 nodejs 或者 swoole 来实现更合适?
shintendo
2019-12-23 15:18:13 +08:00
没看懂,检测被墙不是应该从境内主机和境外主机分别连接检测目标吗?
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
2019-12-23 15:36:01 +08:00
并发的问题自己另外琢磨下吧,我这个没弄并发的事情
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
2019-12-23 16:30:28 +08:00
@cepczkd 非常感谢您
可以加我 q 吗 (base64)
OTU3NDc5MjQ1

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

封个小小的利是
FaceBug
2019-12-23 17:04:27 +08:00
@xxbutoo 没事,不用了,我也是半抄的
runtu2019
2019-12-23 17:13:56 +08:00
用 curl 就行,被墙了 curl 会返回一个很常规的错误码具体是哪个我忘了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/631528

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX