#35131 [Asn->Fbk]: stream_select() in conjuntion with popen() does not appear to work
| From: | sniper@php.net | Date: | Sun, 06 Nov 2005 22:17:29 +0000 |
| Subject: | #35131 [Asn->Fbk]: stream_select() in conjuntion with popen() does not appear to work | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-87708@lists.php.net to get a copy of this message | ||
ID: 35131
Updated by: sniper@php.net
Reported By: larryjadams at comcast dot net
-Status: Assigned
+Status: Feedback
Bug Type: *General Issues
Operating System: WindowsXP Pro SP2
PHP Version: 5.0.5
Assigned To: wez
New Comment:
Please try using this CVS snapshot:
http://snaps.php.net/php5-latest.tar.gz
For Windows:
http://snaps.php.net/win32/php5-win32-latest.zip
Previous Comments:
------------------------------------------------------------------------
[2005-11-06 23:09:04] sniper@php.net
Assigned to the author of this part.
------------------------------------------------------------------------
[2005-11-06 22:07:19] larryjadams at comcast dot net
Description:
------------
If I call $my_fd = popen("mycommand", "rb"); to a function that
hangs/suspends and then subsquently call:
stream_select(...) using $read=array($my_fd) with a timeout, the
steam_select returns immediately, event if I have set $my_fd as
blocking using stream_set_blocking();
I would like stream_select to wait on output from the pipe prior to
firing, or to drive a timeout.
Thanks,
Larry Adams
The Cacti Group
Reproduce code:
---------------
if (function_exists("stream_select")) {
if ($config["cacti_server_os"] == "unix") {
$fp = popen($command, "r");
}else{
$fp = popen($command, "rb");
}
/* set script server timeout */
$script_timeout = read_config_option("script_timeout");
/* establish timeout variables */
$to_sec = floor($script_timeout/1000);
$to_usec = ($script_timeout%1000)*1000;
/* Prepare the read array */
$read = array($fp);
stream_set_blocking ($fp, 1);
if (false === ($num_changed_streams = stream_select($read, $write =
NULL, $except = NULL, $to_sec, $to_usec))) {
cacti_log("WARNING: SERVER POPEN Timed out.");
$output = "U";
}elseif ($num_changed_streams > 0) {
$output = fgets($fp, 4096);
}
pclose($fp);
}else{
$output =
$command;
}
$command = a file with the following:
<?php sleep(20); echo "Hello:20.00\n"; ?>
The stream_select timeout is 5 seconds.
Expected result:
----------------
popen will be called, stream_select will block until timeout has
expired, the number of fd's changed will be 0 and my result will be as
expected.
Actual result:
--------------
stream_select returns immediately.
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=35131&edit=1