|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2014-07-07 13:40 UTC] marcus at synchromedia dot co dot uk
Description: ------------ I'm using pecl_http 2.0.x. I'm issuing multiple requests in one go using enqueue, and if a transfer fails it throws an exception which I catch and ignore because the details of it will be revealed when inspecting Responses afterwards. So I loop over the responses provided by the client, all of which are http\Response instances, and yet I receive this error when calling getResponseCode: PHP Warning: http\Message::getResponseCode(): http\Message is not if type response (note the mis-spelling of 'of', probably makes it easier to track down). So the http\Client::getResponse is returning http\Response objects as expected, but when I call a method on one to get its status, it complains that it's another type?? It's hard to tell what it's meant to be doing because the Response class is almost entirely undocumented: http://devel-m6w6.rhcloud.com/mdref/http/Client/Response Test script: --------------- <?php $urls = array( 'http://www.apple.com/', 'http://www.google.com/', 'http://www.googlesdfasdfsadfsdf.com/' ); $client = new http\Client; $client->setOptions(array( 'timeout' => 5, 'connecttimeout' => 5, )); foreach ($urls as $url) { $client->enqueue(new http\Client\Request('GET', $url)); } try { //Issue all the requests $client->send(); } catch (http\Exception $e) { //Ignore exceptions - they will have bad response codes too } //Parse responses while ($response = $client->getResponse()) { echo get_class($response)."\n"; $url = $response->getTransferInfo('effective_url'); if ($response->getResponseCode() == 200) { $e = $response->getBody(); //echo $e; } } Expected result: ---------------- I'm not sure what it's meant to do because it's not documented, but it certainly shouldn't be breaking weirdly like this. Actual result: -------------- http\Client\Response http\Client\Response http\Client\Response PHP Warning: http\Message::getResponseCode(): http\Message is not if type response in test.php on line 25 PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sun Oct 26 02:00:01 2025 UTC |
Thanks for getting back to me. If I issue my requests with: while (@$client->once()) { $client->wait(); } Where would failure information be stored when iterating over the output of getResponse afterwards? Dealing with them inside that loop seems like it might interfere with the parallel nature of the requests? If not, how can I get a handle on which Request object caused the error, assuming they could complete or fail in random order? When you say "I'll fix that", do you mean that getResponse will return a proper Response instance with error info instead of complaining it's a Message? I'm using this in two places - a link checker and an image grabber - where I want all the requests to happen (even if some fail), in parallel, and assess the responses afterwards. I'm also getting consistent segfaults in the test script on the first line inside the getResponse loop if I step through it with xdebug (in PHPStorm). I don't know if that's your department.Disregard the exception behavior I gave before, it seems I tripped over old memory. $response->getTransferInfo("error") should contain the same information like the exception message. I committed a fix for the uninitialized response object to R_2_0 and master. Could you try one of those? Do you mean that "get_class($response);" segfaults with XDebug? I'll have a look! What's your XDebug version=?That doesn't quite work - it's assuming the includes are in the ext/ folder under a PHP source tree, not built independently. I worked around that by making an ext folder containing a symlink back to its parent folder and then it found them ok, but then it fails with this error, which seems unrelated: /Users/marcus/Sites/pecl_http/php_http_params.c:714:5: error: use of undeclared identifier 'HASH_KEY_NON_EXISTENT' && HASH_KEY_NON_EXISTENT != (key.type = zend_hash_get_current_key_ex(ht, &key.str, &key.len, &key.num, key.dup, NULL)) ^ 1 error generated. make: *** [php_http_params.lo] Error 1 `make' failed