在DNS缓存中找不到主机名

时间:2017-07-30 08:54:05

标签: php network-programming

我的一个项目与gateway.watsonplatform.net存在间歇性连接问题。它一直工作正常,没有任何改变,但现在,80%的时间,它在DNS缓存中找不到主机名。

我已尝试设置CURLOPT_RESOLVE选项,但它只是在输出中添加了一条关于将主机名添加到缓存中的行,但之后仍未找到它。

我试图在本地运行该项目,我发现它是特定于网络的。它适用于一个接入点,另一方面,它有连接问题。

另一个奇怪的提示:shell中的curl命令可以工作。

有输出:

  
      
  • 将gateway.watsonplatform.net:80:158.85.132.88添加到DNS缓存
  •   
  • 在DNS缓存中找不到主机名
  •   
  • 无法解析主机:gateway.watsonplatform.net
  •   

更新 端口应该是443,而不是80.在此更改之后,它可以工作。删除整个此作业后,它仍然有效。现在,我无法重现这个问题。

3 个答案:

答案 0 :(得分:0)

当我在一个Customer中使用IBM Watson实现一个项目时,我遇到了同样的问题。在这种情况下:您需要在代理网络中释放URL。

cURL和Nodejs调用的原因是因为服务器正在通过防火墙进行呼叫,而不是为您的代理网络传递。

确保在您的服务器中设置代理时网址是否有效:在SO内部进行高级连接(选项互联网)。

答案 1 :(得分:0)

作为一个有点丑陋的黑客来让它工作,你可以添加一个主机文件别名,也许用每小时的cronjob加强来更新真实的IP - 代价是每次实际更改时脚本失败长达1小时IP? (实际上,当我遇到类似的问题时,这几年回来了,我不认为我仍然有源代码,生病检查)

编辑:我没有原始的cronjob,但它看起来像这样:

<?php
declare(strict_types = 1);
$hosts = '/etc/hosts';
assert ( is_file ( $hosts ) && is_readable ( $hosts ) && is_writable ( $hosts ), 'need access to ' . $hosts );
$host = 'google.com';
$ip = getIP ( $host );
$str = file_get_contents ( $hosts );
$start = strpos ( $str, '#<wtf_cronjob>' );
$end = strpos ( $str, '#</wtf_cronjob>' );
assert ( false !== $start && false !== $end, 'invalid syntax for hosts file!' );
$end += strlen ( '#</wtf_cronjob>' );
$newstr = substr ( $str, 0, $start ) . '#<wtf_cronjob>' . "\n" . $ip . ' ' . $host . ' ' . "\n" . '#</wtf_cronjob>' . substr ( $str, $end );
file_put_contents ( $hosts, $newstr );
function getIP(string $host, string $dns = '8.8.8.8'): string {
    exec ( 'host ' . escapeshellarg ( $host ) . ' ' . escapeshellarg ( $dns ) . ' 2>&1', $lines, $ret );
    if ($ret !== 0) {
        ob_start ();
        var_dump ( $lines, $ret );
        $debugstr = ob_get_clean ();
        throw new \RuntimeException ( 'host failed. debuginfo: ' . $debugstr );
    }
    foreach ( $lines as $line ) {
        if (false === stripos ( $line, 'has address ' )) {
            continue;
        }
        // found it
        $ret = trim ( substr ( $line, stripos ( $line, 'has address ' ) + strlen ( 'has address ' ) ) );
        if (! filter_var ( $ret, FILTER_VALIDATE_IP )) {
            throw new \RuntimeException ( 'the extracted ip address is invalid! (wrong syntax for host?)' );
        }
        return $ret;
    }
    throw new \RuntimeException ( 'could not find ip address!' );
}

在hosts文件中添加以下新行:

#<wtf_cronjob>
216.58.209.142 google.com 
#</wtf_cronjob>

答案 2 :(得分:0)

我尝试手动分配域应该如何解析。从此步骤开始,请求正在运行,删除此分配后,它仍然有效。