S
S
Sergey2015-05-22 14:09:06
css
Sergey, 2015-05-22 14:09:06

How to properly catch Could not resolve host error in curl_multi php?

Here is the code for asynchronous curl page requests almost from the official documentation:

$urls = array('');

$chm = curl_multi_init();
$tasks = array();

foreach ($urls as $url) {
    $ch = curl_init('http://' . $url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    $tasks[$url] = $ch;

    curl_multi_add_handle($chm, $ch);
}

$active = null;
do {
    $mrc = curl_multi_exec($chm, $active);
}
while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && ($mrc == CURLM_OK)) {
    if (curl_multi_select($chm) != -1) {
        do {
            $info = curl_multi_info_read($chm);
            if ($info['msg'] == CURLMSG_DONE) {
                $ch = $info['handle'];
                $url = array_search($ch, $tasks);
                $tasks[$url] = array(
                    'http_code' => curl_getinfo($ch, CURLINFO_HTTP_CODE),
                    'content' => curl_multi_getcontent($ch));
                curl_multi_remove_handle($chm, $ch);
                curl_close($ch);
            }
        }
        while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }

    $mrc = curl_multi_exec($chm, $active);
}
curl_multi_close($chm);

It works great, but there is one thing that I've been tinkering with for a few hours now. In this case, it turns out only to catch successfully completed operations, but not errors associated with typos in the url. How to catch these errors?

Answer the question

In order to leave comments, you need to log in

3 answer(s)
A
alex, 2018-06-30
@boga-net

spoiler
1. В данном примере анимация сделана на css (css-transition):
.dropdown {
  transition: all .3s ease;
}

2. У каждого dropdown два состояния:
А) dropdown скрыт:
.dropdown {
  opacity: 0;
  visibility: hidden;
  transform: translateY(30px);
}

Б) dropdown видим:
opacity: 1;
  visibility: visible;
  transform: translateY(0px);

3. Когда на одном из пунктов меню генерируется событие mouseover, на него вешается класс focus, который инициирует переход А --> Б:
menuitem.mouseover(function(){
  this.addClass('focus');
});

.menuitem.focus > .dropdown {
  opacity: 1;
  visibility: visible;
  transform: translateY(0px);
}

4. Соответсвенно, при наступлении события mouseout, этот класс удаляется, причем не сразу, а с задержкой в 300мс, после чего инициируется переход Б --> А:
menuitem.mouseout(function(){
  id = setTimeout(function(){
    this.removeClass(focus);
  }, 300);
});

5. Если вы наводите курсор на очередной пункт меню, а dropdown предыдущего пункта еще не спрятался (т.к. еще не истекла задеркжка в 300мс), происходит форсированное убирание класса focus с предыдущего пункта меню, в этом случае п. 3 можно переписать следующим образом:
function forceRemoveClass() {
  window.clearInterval(id);
  prevMenuitem.removeClass('focus');
}
...
menuitem.mouseover(function(){
  forceRemoveClass(); 
  this.addClass('focus');
});

A
A person from Kazakhstan, 2018-06-30
@LenovoId

I don't have any menu at all.
5b37a23952165390666056.png

H
He11ion, 2015-05-22
@He11ion

have you tried curl_multi_strerror?

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question