1<?php 2 3define ("PHP_CURL_SERVER_HOSTNAME", "localhost"); 4define ("PHP_CURL_SERVER_PORT", 8964); 5define ("PHP_CURL_SERVER_ADDRESS", PHP_CURL_SERVER_HOSTNAME.":".PHP_CURL_SERVER_PORT); 6 7function curl_cli_server_start() { 8 if(getenv('PHP_CURL_HTTP_REMOTE_SERVER')) { 9 return getenv('PHP_CURL_HTTP_REMOTE_SERVER'); 10 } 11 12 $php_executable = getenv('TEST_PHP_EXECUTABLE'); 13 $doc_root = __DIR__; 14 $router = "responder/get.inc"; 15 $cmd = [$php_executable, '-t', $doc_root, '-n', '-S', PHP_CURL_SERVER_ADDRESS, $router]; 16 $descriptorspec = array( 17 0 => STDIN, 18 1 => STDOUT, 19 2 => array("null"), 20 ); 21 $handle = proc_open($cmd, $descriptorspec, $pipes, $doc_root, null, array("suppress_errors" => true)); 22 23 // note: even when server prints 'Listening on localhost:8964...Press Ctrl-C to quit.' 24 // it might not be listening yet...need to wait until fsockopen() call returns 25 $error = "Unable to connect to server\n"; 26 for ($i=0; $i < 60; $i++) { 27 usleep(50000); // 50ms per try 28 $status = proc_get_status($handle); 29 $fp = @fsockopen(PHP_CURL_SERVER_HOSTNAME, PHP_CURL_SERVER_PORT); 30 // Failure, the server is no longer running 31 if (!($status && $status['running'])) { 32 $error = "Server is not running\n"; 33 break; 34 } 35 // Success, Connected to servers 36 if ($fp) { 37 $error = ''; 38 break; 39 } 40 } 41 42 if ($fp) { 43 fclose($fp); 44 } 45 46 if ($error) { 47 echo $error; 48 proc_terminate($handle); 49 exit(1); 50 } 51 52 register_shutdown_function( 53 function($handle) use($router) { 54 proc_terminate($handle); 55 /* Wait for server to shutdown */ 56 for ($i = 0; $i < 60; $i++) { 57 $status = proc_get_status($handle); 58 if (!($status && $status['running'])) { 59 break; 60 } 61 usleep(50000); 62 } 63 }, 64 $handle 65 ); 66 67 return PHP_CURL_SERVER_ADDRESS; 68} 69