Можно ли как-нибудь настроить апач, чтобы он вообще не отправлял заголовков, чтобы отправкой заголовков занимался только скрипт?
Не могу что-то разобраться с сокетами. Задача такая: телнетом подключиться к сокету и получить ответ. PHP: <?php set_time_limit(5); $socket=socket_create(AF_INET, SOCK_STREAM, 0); $slist=socket_create_listen(12345,1); while(true) { if(socket_accept($slist)) { $a='Hello!'; $b=&$a; socket_write($socket,$b,6); } } ?> 1)Запускаю скрипт в консоли PHP 2)Подключаюсь телнетом Код (Text): telnet localhost 12345 3)Вижу в консоли ошибку Код (Text): Warning: socket_write(): unable to write to socket [0]: ╟ряЁюё эр юЄяЁртъє шыш яюыєўхэшх фрээ√ї (when sending on a datagram socket using a sendto call) no address was supplied. И нигде не могу найти хорошей статьи по работе скрипта PHP в роли сервера
Я правильно понял, что такой сервер не будет работать на виртуальном хосте, не имеющем выделенного ip-адреса (т.е. что к нему нельзя будет подключиться через интернет)?
Зависит от хостинга. Если ничего не заблокировано - будет висеть на IP адресах хостинг-машины и быть вполне доступным.
Есть еще парочка вопросов... В оригинальном скрипте (по ссылке, которую дал Sergey89 (кстати, в нём несколько ошибок - от перепутывания имен переменных и передачи неправильных данных функциям до нехватки нескольких условия (что приводит к ошибкам типа Warning (но покрайней мере лучший наглядный пример идеи сервера на PHP )))) Сейчас он выглядит у меня вот так: PHP: <?php // Set time limit to indefinite execution set_time_limit(0); // Set the ip and port we will listen on $address = '127.0.0.1'; $port = 9001; $max_clients = 10; // Array that will hold client information $clients = Array(); // Create a TCP Stream socket $sock = socket_create(AF_INET, SOCK_STREAM, 0); // Bind the socket to an address/port socket_bind($sock, $address, $port) or die('Could not bind to address: '.$address); // Start listening for connections socket_listen($sock); // Loop continuously while (true) { sleep(1); // Setup clients listen socket for reading $read[0] = $sock; for ($i = 0; $i < $max_clients; $i++) { if ($clients[$i]['sock'] != null) $read[$i + 1] = $clients[$i]['sock'] ; } // Set up a blocking call to socket_select() $null=null; $ready = socket_select($read,$null,$null,$null); /* if a new connection is being made add it to the client array */ if (in_array($sock, $read)) { for ($i = 0; $i <= $max_clients; $i++) { if ($clients[$i]['sock'] == null) { $clients[$i]['sock'] = socket_accept($sock); break; } elseif ($i == $max_clients) { socket_close($clients[$i]['sock']); unset($clients[$i]); break; } } if (--$ready <= 0) continue; } // end if in_array // If a client is trying to write - handle it now for ($i = 0; $i < $max_clients; $i++) // for each client { if (in_array($clients[$i]['sock'] , $read)) { while ($input .= socket_read($clients[$i]['sock'],1)) { if(substr_count($input,"\r\n")) { $input=str_replace("\r\n",null,$input); break; } } if ($input == 'Bye!' or $input == null) { // String meaning disconnected unset($clients[$i]); } elseif ($input == 'exit') { // requested disconnect socket_close($sock); die; } else { // strip white spaces and write back to user $output = $input."\r\n"; socket_write($clients[$i]['sock'],$output); } $input=null; } elseif (key_exists($i,$clients)) { // Close the socket socket_close($clients[$i]['sock']); unset($clients[$i]); } } } // end while // Close the master sockets socket_close($sock); ?> 1)Как можно оптимизировать бесконечный цикл, чтобы он не грузил систему, кроме sleep? 2)В оригинальном скрипте 56-я строка моего выглядит так: PHP: $input = socket_read($client[$i]['sock'] , 1024); так вот, это не работает. Скрипт не ждет, пока поучит 1024 байт. Как можно заставить его ждать (вариант накопления буфера по одному байту не в счет)?
флоппик Спасибо, но ресурс, возвращаемый функциями socket_create и socket_accept, она почему-то не принимает: Код (Text): Warning: stream_set_blocking(): supplied resource is not a valid stream resource