|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2008-09-11 12:13 UTC] sebastian@php.net
Description:
------------
The code below works fine with PHP 5.2.6 (and earlier), but not with the unreleased PHP 5.2.7 and PHP 5.3.0:
892 $handle = @fopen($url, 'r');
893
894 if (!$handle) {
895 throw new RuntimeException(
896 'Could not connect to the Selenium RC server.'
897 );
898 }
899
900 stream_set_blocking($handle, 1);
901 stream_set_timeout($handle, 0, $this->timeout);
902
903 $info = stream_get_meta_data($handle);
904 $response = '';
905
906 while ((!feof($handle)) && (!$info['timed_out'])) {
907 $response .= fgets($handle, 4096);
908 $info = stream_get_meta_data($handle);
909 }
910
911 fclose($handle);
The code above hangs with PHP 5.2.7 and PHP 5.3.0 in line 906 as shown using Xdebug's tracing:
fopen() Driver.php:892
stream_set_blocking() Driver.php:900
stream_set_timeout() Driver.php:901
stream_get_meta_data() Driver.php:903
feof() Driver.php:906
fgets() Driver.php:907
stream_get_meta_data() Driver.php:908
feof() Driver.php:906
The second feof() call above hangs.
More information can be found here:
- http://static.phpunit.de/trace.818532121.xt
- http://static.phpunit.de/strace.txt
Changing the loop to
while (!$info['eof'] && !$info['timed_out']) {
$response .= fgets($handle, 4096);
$info = stream_get_meta_data($handle);
}
fixes the problem. This means a difference between feof() and $info['eof'].
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Nov 03 02:00:02 2025 UTC |
Shorter reproduce code: <?php $socket = stream_socket_client('tcp://www.php.net:80'); var_dump(feof($socket)); ?> The feof() will block until timeout is reached. David, your fix correctly made feof() behave as documented (blocks until timeout is reached if no data is available), but should feof() really blocks here ? It seems it never behaved as documented (checked php4.4, 5.1, 5.2.6).