фон
Когда я пишу проект, мне нужно выполнить простую постоянную задачу, поэтому я использую swole (в конце концов, phper и плотное планирование, скорость разработки swoole выше, чем java и go).
свул 4
swoole 4 полностью поддерживает автоматическую совместную работу, что имеет большие преимущества для разработчиков php.
Дай мне каштан.
$http->on('request',function (Swoole\Http\Request $req, Swoole\Http\Response $res) { //todo: it's already scheduling. });
Если вы используете swoole, вам лучше использовать последнюю версию (конечно, документы могут не успевать, что должно быть решено друзьями аудитории. Это не рекомендуется для новичков php).
4.4 – это версия с долгосрочной поддержкой, целью которой является переход на промышленный уровень (сейчас: 23 октября 2019 года)
Внешность
Я использовал guzzlehttp/guzzle в своем проекте, версия ^ 6.3.
Затем, начиная с одного дня, появляется странная ошибка.
Could not resolve: oapi.dingtalk.com (Successful completion)
Код выглядит следующим образом:
$client = new \GuzzleHttp\Client([ 'base_uri' => 'https://oapi.dingtalk.com', 'timeout' => 5.0, 'verify' => false, ]); try{ $response = $client->request('POST', PATH, [ ...... ]); unset($client); $code = $response->getStatusCode(); if ($code == 200) { $data = json_decode($response->getBody()->getContents(), true); return $data; } Logs::writeErrorLog('xxxx Failure timeout code:' . $code, false); return []; }catch(Exception $e) { Logs::writeErrorLog('xxxx Failure timeout error:' . $e->getMessage()); }
catch всегда улавливает ошибки? И dns не может быть разрешен?
Диагностика
Браузер https://oapi.dingtalk.com нормальный
завиток https://oapi.dingtalk.com .
Тот же параметр, отправка почтальоном, нормальный.
Но он не может быть перезапущен. (прости меня, перезапусти Дафа). Это нормально в первый раз после перезагрузки, и gg Smecta
Если тайм-аут удален, происходит ли сбой разрешения dns?
Рукописный завиток
Волшебное время настало. Посмотрите на код.
$ch = curl_init($url); // Start a CURL session $useragent="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1"; curl_setopt($ch, CURLOPT_USERAGENT, $useragent); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4); curl_setopt($ch, CURLOPT_TIMEOUT, 8); curl_setopt($ch, CURLOPT_LOW_SPEED_TIME, 10); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Skip certificate check curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // Check if SSL encryption algorithm exists from certificate curl_setopt($ch, CURLOPT_DNS_USE_GLOBAL_CACHE, false ); curl_setopt($ch, CURLOPT_DNS_CACHE_TIMEOUT, 2 ); $tmpInfo = curl_exec($ch); //Return the json object of the api $code = curl_errno($ch); $error = ''; if($code != '') { $error = curl_error($ch); } $httpCode = curl_getinfo($ch,CURLINFO_HTTP_CODE); curl_close($ch); var_dump($tmpInfo, $code, $httpCode);
ложь , 6 ????
Да, код 6
error : CURLE_COULDNT_RESOLVE_HOST (6) Couldn't resolve host. The given remote host was not resolved.
Похоже, что весь dns исчез.
Повторите попытку несколько раз, все нормально, но есть проблема с хостом разрешения.
Решение
Поскольку узел не может быть разрешен, вручную разрешите dns и соедините узел узла.
Поскольку узел не может быть разрешен, вручную разрешите dns и соедините узел узла.
Было замечено, что curl поддерживает разрешение curlopt “.
Керлопт? Решительность? Предоставляет пользовательский адрес, который определяет хост и порт.
Строка, содержащая хост, порт и IP-адрес. Каждый элемент массива разделяется двоеточием.
Формат: массив(“example.com:80:127.0.0.1”): добавлен в cURL 7.21.3, доступен с PHP 5.5.0.
Прежде всего, нам нужно получить ip-адрес хоста. Код выглядит следующим образом:
function getIp($host) : string{ $ip = gethostbyname('oapi.dingtalk.com'); if($ip == 'oapi.dingtalk.com') { return $ip; } $dns = dns_get_record('oapi.dingtalk.com'); if(is_array($dns)) { foreach ($dns as $dn) { if(isset($dn['type']) and $dn['type'] == 'A') { if(isset($dn['ip'])) { return $dn['ip']; } } } } return ''; }
Затем добавьте параметры к приведенному выше завитку.
$ip = getIp('oapi.dingtalk.com'); if($ip != '') { curl_setopt($ch, CURLOPT_RESOLVE, ['oapi.dingtalk.com:443:'.$ip]); }
Полные примечания к разрешению
- В настоящее время эта проблема обнаруживается только во всем процессе.
- Curlopt ﹣ resolve может быть полностью применен в системе интрасети (для решения проблем dns, требующих много времени)
Оригинал: “https://programmer.help/blogs/a-strange-trip-to-http-curl.html”