+ fpassthru($stderr);
+ fpassthru($stdout);
+ return;
+ }
+ }
+
+}
+
+function proc($bin, $args, $cb) {
+ $spec = array(array("pipe","r"), array("pipe","w"), array("pipe","w"));
+ $comm = escapeshellcmd($bin) . " ". implode(" ", array_map("escapeshellarg", $args));
+ if (($proc = proc_open($comm, $spec, $pipes, __DIR__))) {
+ $stdin = $pipes[0];
+ $stdout = $pipes[1];
+ $stderr = $pipes[2];
+
+ do {
+ $port = trim(fgets($stderr));
+ $R = array($stderr); $W = array(); $E = array();
+ } while (is_numeric($port) && stream_select($R, $W, $E, 0, 10000));
+
+ if (is_numeric($port)) {
+ try {
+ $cb($port, $stdin, $stdout, $stderr);
+ } catch (Exception $e) {
+ echo $e,"\n";
+ }
+ }
+