Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- // Set the ip and port we will listen on
- $address = '127.0.0.1';
- $port = 8080;
- $SEMKey = "123456" ;
- $keepAliveTimeout = 8;
- echo "Start...\n";
- $cntChildren = 0;
- $socket = stream_socket_server( "tcp://$address:$port", $errno, $errstr);
- if (!$socket) {
- echo "$errstr ($errno)\n";
- exit;
- }
- while( $cntChildren < 20 ) {
- $pid = pcntl_fork();
- $cntChildren++;
- if ($pid == -1) {
- echo "Warning: Cannot spawn child process!!!\n";
- }
- elseif($pid) {
- // Parent process
- }
- else {
- echo "Spawned Child\n";
- ## Get Semaphore id
- $seg = sem_get( $SEMKey );
- while( 1 ) {
- // Child process
- sem_acquire($seg);
- $conn = @stream_socket_accept( $socket );
- sem_release($seg);
- if( $conn ) {
- stream_set_timeout($conn, 2);
- $keepAlive = false;
- do {
- $_SERVER_HTTP = array();
- if( feof($conn) || ($keepAlive != false && $keepAlive < time()-$keepAliveTimeout) ) {
- break;
- }
- // Get first line from client
- do {
- $input = fgets($conn);
- }
- while( !feof($conn) && ($keepAlive == false || $keepAlive > time()-$keepAliveTimeout) && $input == "" );
- if( feof($conn) || ($keepAlive != false && $keepAlive < time()-$keepAliveTimeout) ) {
- break;
- }
- $inputParsed = preg_split('/[\s]+/', $input );
- $_SERVER_HTTP['REQUEST_METHOD'] = strtoupper( $inputParsed[0] );
- $_SERVER_HTTP['REQUEST_URI'] = $inputParsed[1];
- $_SERVER_HTTP['SERVER_PROTOCOL'] = strtoupper( $inputParsed[2] );
- $HTTP_HEADERS = array();
- while( !feof($conn) && ($keepAlive == false || $keepAlive > time()-$keepAliveTimeout) && ($input = fgets($conn) ) != "\r\n" ) {
- if( preg_match('/([^:]+): (.*)/', $input, $matches) ) {
- $HTTP_HEADERS[ strtolower($matches[1]) ] = trim($matches[2]);
- }
- }
- if( feof($conn) || ($keepAlive != false && $keepAlive < time()-$keepAliveTimeout) ) {
- break;
- }
- $_SERVER_HTTP['SERVER_SOFTWARE'] = 'MistralPHP';
- $_SERVER_HTTP['SERVER_ADDR'] = $address;
- $_SERVER_HTTP['SERVER_PORT'] = $port;
- $remoteIp = explode( ':', stream_socket_get_name( $conn, true ) );
- $_SERVER_HTTP['REMOTE_ADDR'] = $remoteIp[0];
- $_SERVER_HTTP['REMOTE_PORT'] = $remoteIp[1];
- //print_r( $HTTP_HEADERS );
- if( isset( $HTTP_HEADERS['connection'] ) && strtolower($HTTP_HEADERS['connection']) == 'keep-alive' ) {
- $keepAlive = time();
- //echo "-----------KEEP-ALIVE\n";
- }
- else {
- $keepAlive = false;
- }
- //$str = "Hello world! ($cntChildren)\n". print_r( $_SERVER_HTTP, true ) ."\n\n". print_r( $tmp, true ) ."\n\n". print_r( $HTTP_HEADERS, true );
- $str = "Hello world!\r\n";
- $output = "HTTP/1.1 200 OK\r\n"
- ."Server: MistralPHP v1.00\r\n"
- ."Content-Length: ". strlen($str) ."\r\n"
- ."Content-Type: text/plain\r\n";
- if( $keepAlive != false ) {
- $output .= "Connection: Keep-Alive\r\n";
- }
- else {
- $output .= "Connection: close\r\n";
- }
- $output .= "\r\n"
- . $str;
- fwrite( $conn, $output );
- }
- while( $keepAlive != false && $keepAlive > time()-300 && !feof($conn) );
- fclose( $conn );
- }
- }
- exit;
- }
- }
- while( 1 ) {
- sleep(5);
- }
- socket_close($socket);
- ?>
Add Comment
Please, Sign In to add comment