function serve(callable $cb) {
foreach (range(8000, 9000) as $port) {
- if (($server = stream_socket_server("tcp://localhost:$port"))) {
+ if (($server = @stream_socket_server("tcp://localhost:$port"))) {
fprintf(STDERR, "%s\n", $port);
do {
$R = [$server]; $W = []; $E = [];
}
function server($handler, callable $cb) {
- $spec = array(array("pipe","r"), array("pipe","w"), array("pipe","w"));
- $comm = sprintf("%s %s/%s", PHP_BINARY, __DIR__, $handler);
- if (($proc = proc_open($comm, $spec, $pipes, __DIR__))) {
- $port = trim(fgets($pipes[2]));
+ proc(PHP_BINARY, [__DIR__."/$handler"], $cb);
+}
+
+function nghttpd(callable $cb) {
+ $spec = [["pipe","r"], ["pipe","w"], ["pipe","w"]];
+ foreach (range(8000, 9000) as $port) {
+ $comm = "exec nghttpd -d html $port http2.key http2.crt";
+ if (($proc = proc_open($comm, $spec, $pipes, __DIR__))) {
+ $stdin = $pipes[0];
+ $stdout = $pipes[1];
+ $stderr = $pipes[2];
+
+ usleep(50000);
+ $status = proc_get_status($proc);
+
+ if (!$status["running"]) {
+ continue;
+ }
+
+ try {
+ $cb($port, $stdin, $stdout, $stderr);
+ } catch (Exception $e) {
+ echo $e,"\n";
+ }
- try {
- $cb($port, $stdin = $pipes[0], $stdout = $pipes[1], $stderr = $pipes[2]);
- } catch (Exception $e) {
- echo $e,"\n";
+ proc_terminate($proc);
+
+ fpassthru($stderr);
+ fpassthru($stdout);
+ return;
}
+ }
+
+}
+
+function proc($bin, $args, callable $cb) {
+ $spec = [["pipe","r"], ["pipe","w"], ["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 = [$stderr]; $W = []; $E = [];
+ } 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";
+ }
+ }
+
proc_terminate($proc);
-
+
fpassthru($stderr);
fpassthru($stdout);
}
-}
+}
\ No newline at end of file