За последние 24 часа нас посетили 66615 программистов и 1617 роботов. Сейчас ищут 1048 программистов ...

Заголовки сервера

Тема в разделе "Вопросы от блондинок", создана пользователем [vs], 16 янв 2009.

  1. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Можно ли как-нибудь настроить апач, чтобы он вообще не отправлял заголовков, чтобы отправкой заголовков занимался только скрипт?
     
  2. А зачем тогда тебе Апач? Пусть сам скрипт слушает на определенном порту и шлет, что хочет.
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Не могу что-то разобраться с сокетами. Задача такая: телнетом подключиться к сокету и получить ответ.
    PHP:
    1. <?php
    2. $socket=socket_create(AF_INET, SOCK_STREAM, 0);
    3. $slist=socket_create_listen(12345,1);
    4. while(true) {
    5.     if(socket_accept($slist)) {
    6.         $a='Hello!';
    7.         $b=&$a;
    8.         socket_write($socket,$b,6);
    9.     }
    10. }
    11. ?>
    1)Запускаю скрипт в консоли PHP
    2)Подключаюсь телнетом
    Код (Text):
    1. telnet localhost 12345
    3)Вижу в консоли ошибку
    Код (Text):
    1. Warning: socket_write(): unable to write to socket [0]: ╟ряЁюё эр юЄяЁртъє шыш яюыєўхэшх фрээ√ї  (when sending on a datagram socket using a sendto call) no address was supplied.
    И нигде не могу найти хорошей статьи по работе скрипта PHP в роли сервера :(
     
  4. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    WOW! То, что надо!
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Я правильно понял, что такой сервер не будет работать на виртуальном хосте, не имеющем выделенного ip-адреса (т.е. что к нему нельзя будет подключиться через интернет)?
     
  7. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Зависит от хостинга. Если ничего не заблокировано - будет висеть на IP адресах хостинг-машины и быть вполне доступным.
     
  8. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Есть еще парочка вопросов...
    В оригинальном скрипте (по ссылке, которую дал Sergey89 (кстати, в нём несколько ошибок - от перепутывания имен переменных и передачи неправильных данных функциям до нехватки нескольких условия (что приводит к ошибкам типа Warning (но покрайней мере лучший наглядный пример идеи сервера на PHP :)))))
    Сейчас он выглядит у меня вот так:
    PHP:
    1. <?php
    2. // Set time limit to indefinite execution
    3.  
    4. // Set the ip and port we will listen on
    5. $address = '127.0.0.1';
    6. $port = 9001;
    7. $max_clients = 10;
    8.  
    9. // Array that will hold client information
    10. $clients = Array();
    11.  
    12. // Create a TCP Stream socket
    13. $sock = socket_create(AF_INET, SOCK_STREAM, 0);
    14. // Bind the socket to an address/port
    15. socket_bind($sock, $address, $port) or die('Could not bind to address: '.$address);
    16. // Start listening for connections
    17. socket_listen($sock);
    18.  
    19. // Loop continuously
    20. while (true) {
    21.     sleep(1);
    22.     // Setup clients listen socket for reading
    23.     $read[0] = $sock;
    24.     for ($i = 0; $i < $max_clients; $i++)
    25.     {
    26.         if ($clients[$i]['sock']  != null)
    27.             $read[$i + 1] = $clients[$i]['sock'] ;
    28.     }
    29.     // Set up a blocking call to socket_select()
    30.     $null=null;
    31.     $ready = socket_select($read,$null,$null,$null);
    32.     /* if a new connection is being made add it to the client array */
    33.     if (in_array($sock, $read)) {
    34.         for ($i = 0; $i <= $max_clients; $i++)
    35.         {
    36.             if ($clients[$i]['sock'] == null) {
    37.                 $clients[$i]['sock'] = socket_accept($sock);
    38.                 break;
    39.             }
    40.             elseif ($i == $max_clients) {
    41.                 socket_close($clients[$i]['sock']);
    42.                 unset($clients[$i]);
    43.                 break;
    44.             }
    45.         }
    46.         if (--$ready <= 0)
    47.             continue;
    48.     } // end if in_array
    49.      
    50.     // If a client is trying to write - handle it now
    51.     for ($i = 0; $i < $max_clients; $i++) // for each client
    52.     {
    53.         if (in_array($clients[$i]['sock'] , $read))
    54.         {
    55.             while ($input .= socket_read($clients[$i]['sock'],1)) {
    56.                 if(substr_count($input,"\r\n")) {
    57.                     $input=str_replace("\r\n",null,$input);
    58.                     break;
    59.                 }
    60.             }
    61.             if ($input == 'Bye!' or $input == null) {
    62.                 // String meaning disconnected
    63.                 unset($clients[$i]);
    64.             }
    65.             elseif ($input == 'exit') {
    66.                 // requested disconnect
    67.                 socket_close($sock);
    68.                 die;
    69.             }
    70.             else {
    71.                 // strip white spaces and write back to user
    72.                 $output = $input."\r\n";
    73.                 socket_write($clients[$i]['sock'],$output);
    74.             }
    75.             $input=null;
    76.         }
    77.         elseif (key_exists($i,$clients)) {
    78.             // Close the socket
    79.             socket_close($clients[$i]['sock']);
    80.             unset($clients[$i]);
    81.         }
    82.     }
    83. } // end while
    84. // Close the master sockets
    85. socket_close($sock);
    86. ?>
    1)Как можно оптимизировать бесконечный цикл, чтобы он не грузил систему, кроме sleep?
    2)В оригинальном скрипте 56-я строка моего выглядит так:
    PHP:
    1. $input = socket_read($client[$i]['sock'] , 1024);
    так вот, это не работает. Скрипт не ждет, пока поучит 1024 байт. Как можно заставить его ждать (вариант накопления буфера по одному байту не в счет)?
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    флоппик
    Спасибо, но ресурс, возвращаемый функциями socket_create и socket_accept, она почему-то не принимает:
    Код (Text):
    1. Warning: stream_set_blocking(): supplied resource is not a valid stream resource