php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #72060 use curl_multi_*, curl_errno return data not expect
Submitted: 2016-04-20 02:55 UTC Modified: 2016-04-23 23:04 UTC
From: 568089266 at qq dot com Assigned:
Status: Wont fix Package: cURL related
PHP Version: 5.5.34 OS: Osx EI 10.11.4
Private report: No CVE-ID: None
Have you experienced this issue?
Rate the importance of this bug to you:

 [2016-04-20 02:55 UTC] 568089266 at qq dot com
Description:
------------
php version 5.5.32
curl 7.37.0 (x86_64-apple-darwin13.0.2) libcurl/7.37.0 OpenSSL/0.9.8} zlib/1.2.5

I found use curl_multi_* methods, if some curl handle connect fail or execute timeout, use curl_errno function to get the error code, but alway return zero. curl_error function return data is right;

Test script:
---------------
<?php

//example 1
$mh = curl_multi_init();

$ch1 = curl_init('http://www.some_not_exist_host.com');
curl_setopt($ch1, CURLOPT_TIMEOUT, 3);
curl_setopt($ch1, CURLOPT_CONNECTTIMEOUT_MS, 400);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch1, CURLOPT_NOSIGNAL, true);
curl_multi_add_handle($mh, $ch1);

$ch2 = curl_init('http://127.0.0.1');
curl_setopt($ch2, CURLOPT_TIMEOUT, 3);
curl_setopt($ch2, CURLOPT_CONNECTTIMEOUT_MS, 400);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch2, CURLOPT_NOSIGNAL, true);
curl_multi_add_handle($mh, $ch2);

$active = null;
do{
    do {
        $mrc = curl_multi_exec($mh, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);

    if ($mrc != CURLM_OK){
        break;
    }

    $info = curl_multi_info_read($mh, $msgs_in_queue);
    if ($info !== false){
        $ch = $info['handle'];

        var_dump(curl_error($ch));
        var_dump(curl_errno($ch));    //bug? alway return 0

        curl_multi_remove_handle($mh, $ch);
    }

    if ($active > 0) {
        curl_multi_select($mh, 0.5);
    }

}while ($active);

curl_multi_remove_handle($mh, $ch1);
curl_multi_close($mh);


//example 2
echo "----------------", PHP_EOL;
$ch = curl_init('http://www.some_not_exist_host.com');
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 400);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_NOSIGNAL, true);
curl_exec($ch);
var_dump(curl_error($ch));
var_dump(curl_errno($ch));


Expected result:
----------------
string(0) ""
int(0)
string(51) "Could not resolve host: www.some_not_exist_host.com"
int(6)
----------------
string(51) "Could not resolve host: www.some_not_exist_host.com"
int(6)

Actual result:
--------------
string(0) ""
int(0)
string(51) "Could not resolve host: www.some_not_exist_host.com"
int(0)
----------------
string(51) "Could not resolve host: www.some_not_exist_host.com"
int(6)

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2016-04-23 23:04 UTC] pierrick@php.net
-Status: Open +Status: Wont fix
 [2016-04-23 23:04 UTC] pierrick@php.net
There is no way internally to update the errno when the call is triggered with the curl_multi_exec. The error string is automatically updated by libcurl that's why this one is not an issue.

If you want to get the errno you have to do this :

$info = curl_multi_info_read($mh, $msgs_in_queue);
$errno = $info['result'];
 
PHP Copyright © 2001-2019 The PHP Group
All rights reserved.
Last updated: Thu Apr 25 14:01:25 2019 UTC