ID: 35131
Updated by: [EMAIL PROTECTED]
Reported By: larryjadams at comcast dot net
-Status: Open
+Status: Assigned
Bug Type: Streams related
Operating System: WindowsXP Pro SP2
PHP Version: 5CVS-2007-07-17
-Assigned To: wez
+Assigned To: jani
New Comment:
I didn't try it on Windows myself, I'll test this later on *nix.
Previous Comments:
------------------------------------------------------------------------
[2007-07-18 13:53:18] larryjadams at comcast dot net
The set block option now works. However, the stream select still waits
for the script to return or for ever, whichever comes first :). Here is
the revised code. Simply place test1.php and test2.php in the c:\
directory.
test1.php
<?php
$command = "php -q c:/test2.php";
if (function_exists("stream_select")) {
$fp = popen($command, "rb");
/* set script server timeout in milliseconds */
$script_timeout = 5000;
/* 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))) {
echo "WARNING: SERVER POPEN Timed out.\n";
$output = "U";
}elseif ($num_changed_streams > 0) {
$output = fgets($fp, 4096);
echo "Command Exited with a Result of '" . trim($output) .
"'\n";
}
pclose($fp);
}else{
$output = `$command`;
}
?>
test2.php
<?php sleep(20);echo "Ehllo\n"; ?>
TheWitness
------------------------------------------------------------------------
[2007-07-17 14:30:41] [EMAIL PROTECTED]
Please try using this CVS snapshot:
http://snaps.php.net/php5.2-latest.tar.gz
For Windows (zip):
http://snaps.php.net/win32/php5.2-win32-latest.zip
For Windows (installer):
http://snaps.php.net/win32/php5.2-win32-installer-latest.msi
------------------------------------------------------------------------
[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