Monday, January 30, 2012

PHP cURL timeout is not working


I'm having a server issue. I'm running a local server (for developing) and I've changed my local server from MAMP to XAMPP. However, on XAMPP, the cURL option CURLOPT_TIMEOUT_MS or CURLOPT_CONNECTTIMEOUT_MS gives me the next error:




Warning: curl_setopt() expects parameter 2 to be long, string given




Is this because of the PHP or cURL version? Maybe a configuration setting?



curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT_MS, 2500);



Additional information:



  • OSX 10.6.8

  • PHP 5.3.1

  • cURL 7.19.7



Thanks in advance.





Edit: There seems to be some confusion about the error and the variable to set. The error states that parameter 2 is invalid. Not parameter 3 . So the CURLOPT_CONNECTTIMEOUT_MS seems to be the issue.




curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT_MS, 2500);
^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^
parameter: #1 #2 #3



Fun fact: var_dump(CURLOPT_CONNECTTIMEOUT_MS); displays string(25) "CURLOPT_CONNECTTIMEOUT_MS" . Just like the error states, it's a string instead of a float.

2 comments:

  1. For some reason, CURLOPT_CONNECTTIMEOUT_MS is defined incorrectly in your version of PHP. I'd check with whatever distribution of PHP you're using and find out whether it's a general bug.

    The correct value is 156: you should be able to use this instead:

    curl_setopt($this->ch, /*CURLOPT_CONNECTTIMEOUT_MS */ 156, 2500);


    NB that you really really really need to add comments explaining why you're doing this.

    ReplyDelete
  2. After reading your comments, I am sure PHP should also have raised the following warning:


    Notice: Use of undefined constant CURLOPT_CONNECTTIMEOUT_MS - assumed
    'CURLOPT_CONNECTTIMEOUT_MS'


    After looking at curl_setopt() manual, I noticed this sidenote:


    CURLOPT_CONNECTTIMEOUT_MS: Added in cURL 7.16.2. Available since PHP
    5.2.3.


    So make sure the above assertion is true (look at output of phpinfo() to determine PHP and cURL version). Alternately, use CURLOPT_CONNECTTIMEOUT if the millisecond resolution is not really necessary.

    ReplyDelete