Как получить доступ к PHP multi cURL handle response как только это произойдет

isNaN() и Number.isNaN() оба теста, если значение (или, в случае isNaN(), могут быть преобразованы в числовое значение, которое представляет) значение NaN. Другими словами, «NaN» не просто означает, что «это значение не является числом», это конкретно означает «это значение является числовым значением Not-a-Number в соответствии с IEEE-754».

Причина, по которой все ваши тесты выше, возвращает false, потому что все указанные значения могут быть преобразованы в числовое значение, которое не является NaN:

Number('')    // 0
Number('   ') // 0
Number(true)  // 1
Number(false) // 0
Number([0])   // 0

Причина isNaN() «сломан», потому что, якобы, преобразования типов не должны происходить при тестировании значений. Это проблема Number.isNaN(), предназначенная для решения. В частности, Number.isNaN() будет только попытаться сравнить значение с NaN, если значение представляет собой числовое значение. Любой другой тип будет возвращать false, даже если они буквально «не являются числом», потому что тип значения NaN является числом. См. Соответствующие MDN-документы для isNaN() и Number.isNaN() .

Если вы просто хотите определить, имеет ли значение номер type, , даже если это значение NaN , вместо этого используйте typeof:

typeof 'RAWRRR' === 'number' // false

1
задан Lukas 5 March 2019 в 07:56
поделиться

1 ответ

Отвечая на свой вопрос, так как я нигде не мог найти ответ. Вместо того чтобы создавать один обработчик multi-cURL, я создал один для каждого из адресов, которые необходимо запросить. Смотрите код ниже:

$urlList = [                                                            
    'https://httpstat.us/200?sleep=3000',                               
    'https://httpstat.us/200?sleep=1000'                                
];                                                                      

processList($urlList, function($key, $output) {                         
    echo "Output from {$key}\n{$output}\n\n";                             
});                                                                     

function processList($urlList, $closure) {                              

    $curlHandlerList = $multiCurlHandlerList = [];                      

    foreach ($urlList as $i => $url) {                                  
        $ch = $curlHandlerList[$i] = curl_init();                       
        $mh = $multiCurlHandlerList[$i] = curl_multi_init();            

        curl_setopt_array($ch, [                                        
            CURLOPT_URL => $url,                                        
            CURLOPT_HEADER => false,                                    
            CURLOPT_RETURNTRANSFER => true,                             
            CURLOPT_SSL_VERIFYHOST => false,                            
            CURLOPT_SSL_VERIFYPEER => false,                            
        ]);                                                             

        curl_multi_add_handle($mh, $ch);                                
    }                                                                   

    while (count($multiCurlHandlerList)) {                              
        foreach ($multiCurlHandlerList as $i => $mh) {                  
            if (CURLM_OK != curl_multi_exec($mh, $active) || !$active) {

                $html = curl_multi_getcontent($curlHandlerList[$i]);    

                $closure($i, $html);                                    

                curl_multi_remove_handle($mh, $curlHandlerList[$i]);    
                unset($multiCurlHandlerList[$i], $curlHandlerList[$i]); 
            }                                                           
        }                                                               
        usleep(10**4); // 10**4 microseconds => 0.01 seconds            
    }                                                                   
}     
0
ответ дан Lukas 5 March 2019 в 07:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: