我的一个项目与gateway.watsonplatform.net
存在间歇性连接问题。它一直工作正常,没有任何改变,但现在,80%的时间,它在DNS缓存中找不到主机名。
我已尝试设置CURLOPT_RESOLVE
选项,但它只是在输出中添加了一条关于将主机名添加到缓存中的行,但之后仍未找到它。
我试图在本地运行该项目,我发现它是特定于网络的。它适用于一个接入点,另一方面,它有连接问题。
另一个奇怪的提示:shell中的curl命令可以工作。
有输出:
- 将gateway.watsonplatform.net:80:158.85.132.88添加到DNS缓存
- 在DNS缓存中找不到主机名
- 无法解析主机:gateway.watsonplatform.net
更新 端口应该是443,而不是80.在此更改之后,它可以工作。删除整个此作业后,它仍然有效。现在,我无法重现这个问题。
答案 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)
我尝试手动分配域应该如何解析。从此步骤开始,请求正在运行,删除此分配后,它仍然有效。