ID:               35131
 User updated by:  larryjadams at comcast dot net
 Reported By:      larryjadams at comcast dot net
-Status:           Feedback
+Status:           Open
 Bug Type:         Streams related
 Operating System: WindowsXP Pro SP2
 PHP Version:      5CVS-2005-11-07 (snap)
 Assigned To:      wez
 New Comment:

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


Previous Comments:
------------------------------------------------------------------------

[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-07 15:31:28] [EMAIL PROTECTED]

Assigned to the author of this part.

------------------------------------------------------------------------

[2005-11-07 02:09:19] larryjadams at comcast dot net

I have attempted to resolve the issue with the latest CVS.  However, it
does not solve the issue.  The stream_select fires right away even
though the popen does not have anything waiting on the pipe.

The version I tested was:
PHP 5.1.0RC5-dev (cli) (built: Nov  7 2005 00:47:12)
Copyright (c) 1997-2005 The PHP Group
Zend Engine v2.1.0-dev, Copyright (c) 1998-2005 Zend Technologies

I have noted some other issues that I will be opening separate tickets
one.

------------------------------------------------------------------------

[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

Reply via email to