正在做一个域名检测是否被墙功能
有提供 类似这种网址的 00738.com 开放 api 或者思路的大佬加下我 有偿酬谢
1
chendy 2019-12-23 14:49:20 +08:00
想用 PHP 做,为啥放到了 Java 下…
|
3
xxbutoo OP <?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 '被墙了'; } 这是我目前实现的思路 |
4
sunznx 2019-12-23 15:13:44 +08:00
看起来不行,用 nodejs 或者 swoole 来实现更合适?
|
5
shintendo 2019-12-23 15:18:13 +08:00
没看懂,检测被墙不是应该从境内主机和境外主机分别连接检测目标吗?
|
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); |
7
FaceBug 2019-12-23 15:36:01 +08:00
并发的问题自己另外琢磨下吧,我这个没弄并发的事情
|
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"); } } |
12
runtu2019 2019-12-23 17:13:56 +08:00 via Android
用 curl 就行,被墙了 curl 会返回一个很常规的错误码具体是哪个我忘了
|