Guest User

Untitled

a guest
Jul 15th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.29 KB | None | 0 0
  1. <?php
  2. // Set the ip and port we will listen on
  3. $address = '127.0.0.1';
  4. $port = 8080;
  5.  
  6. $SEMKey = "123456" ;
  7.  
  8. $keepAliveTimeout = 8;
  9.  
  10. echo "Start...\n";
  11. $cntChildren = 0;
  12.  
  13. $socket = stream_socket_server( "tcp://$address:$port", $errno, $errstr);
  14. if (!$socket) {
  15. echo "$errstr ($errno)\n";
  16. exit;
  17. }
  18.  
  19. while( $cntChildren < 20 ) {
  20. $pid = pcntl_fork();
  21. $cntChildren++;
  22. if ($pid == -1) {
  23. echo "Warning: Cannot spawn child process!!!\n";
  24. }
  25. elseif($pid) {
  26. // Parent process
  27. }
  28. else {
  29. echo "Spawned Child\n";
  30. ## Get Semaphore id
  31. $seg = sem_get( $SEMKey );
  32. while( 1 ) {
  33. // Child process
  34. sem_acquire($seg);
  35. $conn = @stream_socket_accept( $socket );
  36. sem_release($seg);
  37. if( $conn ) {
  38. stream_set_timeout($conn, 2);
  39. $keepAlive = false;
  40. do {
  41. $_SERVER_HTTP = array();
  42. if( feof($conn) || ($keepAlive != false && $keepAlive < time()-$keepAliveTimeout) ) {
  43. break;
  44. }
  45. // Get first line from client
  46. do {
  47. $input = fgets($conn);
  48. }
  49. while( !feof($conn) && ($keepAlive == false || $keepAlive > time()-$keepAliveTimeout) && $input == "" );
  50. if( feof($conn) || ($keepAlive != false && $keepAlive < time()-$keepAliveTimeout) ) {
  51. break;
  52. }
  53. $inputParsed = preg_split('/[\s]+/', $input );
  54. $_SERVER_HTTP['REQUEST_METHOD'] = strtoupper( $inputParsed[0] );
  55. $_SERVER_HTTP['REQUEST_URI'] = $inputParsed[1];
  56. $_SERVER_HTTP['SERVER_PROTOCOL'] = strtoupper( $inputParsed[2] );
  57. $HTTP_HEADERS = array();
  58. while( !feof($conn) && ($keepAlive == false || $keepAlive > time()-$keepAliveTimeout) && ($input = fgets($conn) ) != "\r\n" ) {
  59. if( preg_match('/([^:]+): (.*)/', $input, $matches) ) {
  60. $HTTP_HEADERS[ strtolower($matches[1]) ] = trim($matches[2]);
  61. }
  62. }
  63. if( feof($conn) || ($keepAlive != false && $keepAlive < time()-$keepAliveTimeout) ) {
  64. break;
  65. }
  66. $_SERVER_HTTP['SERVER_SOFTWARE'] = 'MistralPHP';
  67. $_SERVER_HTTP['SERVER_ADDR'] = $address;
  68. $_SERVER_HTTP['SERVER_PORT'] = $port;
  69. $remoteIp = explode( ':', stream_socket_get_name( $conn, true ) );
  70. $_SERVER_HTTP['REMOTE_ADDR'] = $remoteIp[0];
  71. $_SERVER_HTTP['REMOTE_PORT'] = $remoteIp[1];
  72. //print_r( $HTTP_HEADERS );
  73. if( isset( $HTTP_HEADERS['connection'] ) && strtolower($HTTP_HEADERS['connection']) == 'keep-alive' ) {
  74. $keepAlive = time();
  75. //echo "-----------KEEP-ALIVE\n";
  76. }
  77. else {
  78. $keepAlive = false;
  79. }
  80. //$str = "Hello world! ($cntChildren)\n". print_r( $_SERVER_HTTP, true ) ."\n\n". print_r( $tmp, true ) ."\n\n". print_r( $HTTP_HEADERS, true );
  81. $str = "Hello world!\r\n";
  82. $output = "HTTP/1.1 200 OK\r\n"
  83. ."Server: MistralPHP v1.00\r\n"
  84. ."Content-Length: ". strlen($str) ."\r\n"
  85. ."Content-Type: text/plain\r\n";
  86. if( $keepAlive != false ) {
  87. $output .= "Connection: Keep-Alive\r\n";
  88. }
  89. else {
  90. $output .= "Connection: close\r\n";
  91. }
  92. $output .= "\r\n"
  93. . $str;
  94. fwrite( $conn, $output );
  95. }
  96. while( $keepAlive != false && $keepAlive > time()-300 && !feof($conn) );
  97. fclose( $conn );
  98. }
  99. }
  100. exit;
  101. }
  102. }
  103.  
  104. while( 1 ) {
  105. sleep(5);
  106. }
  107.  
  108. socket_close($socket);
  109. ?>
Add Comment
Please, Sign In to add comment