За последние 24 часа нас посетили 20860 программистов и 1132 робота. Сейчас ищет 371 программист ...

Перерывы в работе скрипта

Тема в разделе "Прочие вопросы по PHP", создана пользователем ShamahN, 18 июн 2010.

  1. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Как бы долгое выполнение выполнение скрипта - это не есть хорошо, но ситуация оправданная. Пхп настроен так что скрипт может выполняться сколько угодно времени, контроль за "зависаниями" реализован другими механизмами)
    Так вот, как бы так сделать, чтобы во время выполнения "долгого" скрипта хоть как-то обрабатывались запросы других пользователей?
     
  2. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    ShamahN
    Скрипт - зацикленный демон? Если да, то можно:
    1)Каждые N итераций проверять некоторый файл на наличие команд от пользователей. После выполнения команды очищать файл.
    2)То же, но с БД.
    3)Прикрутить сокет-сервер и в процессе выполнения слушать порт. При подключении пользователя переходить в другой цикл, в котором скрипт будет читать команды (данные) с сокета и при получении какого-нить спецсимвола (перенос строки например) выполнять полученую команду. После выполнения - читать сокет дальше. Когда клиент отключается - возвращаться к основному циклу.
     
  3. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    [vs]
    нет. Скрипт импортирует данные. много данных. Можно, конечно, разрешить такой импорт только в часы наименьшей загруженности, но это будет неудобно.
    Значит, наверное, лучше делать какие-то настройки. Выкладывать их куда-то файлом, а потом уже кроном заставлять систему произвести импорт ?
     
  4. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Не представляю себе импорт большого объема данных без какого-нибудь цикла. А в цикл всегда можно встроить управление.
    Или я немного не понял
    скрипт на 100% грузит железо или канал? o_0
     
  5. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    [vs]
    Есть, конечно) Сокет-сервер пугает)
    Может виной тому ситуация, что сервер на работе поднят на венике, но когда скрипт работает, другой клиент ждет окончания выполнения скрипта =(
     
  6. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    PHP:
    1. <?php
    2. $address = '94.158.184.183';
    3. $port = 443;
    4. $sock = socket_create(AF_INET, SOCK_STREAM, 0);
    5.  
    6. socket_bind($sock, $address, $port) or die('Could not bind to address: '.$address);
    7. while (true) {
    8.     $read[0] = $sock;
    9.     if ($client != null) {
    10.         $read[$i + 1] = $client;
    11.     }
    12.     $null = null;
    13.     $ready = socket_select($read,$null,$null,$null);
    14.     if (in_array($sock, $read)) {
    15.         if ($client == null) {
    16.             $client = socket_accept($sock);
    17.         }
    18.         if (--$ready <= 0) {
    19.             continue;
    20.         }
    21.     }
    22.     if (in_array($client, $read)) {
    23.         while ($input .= socket_read($client, 128)) {
    24.             if(substr_count($input, "\r\n")) {
    25.                 $input=str_replace("\r\n", null, $input);
    26.                 break;
    27.             }
    28.         }
    29.         if ($input == null) {
    30.             /* отключать клиента, когда получена пустая строка */
    31.             unset($client);
    32.         } else {
    33.             /*
    34.             Делай что-нибудь с командой в $input
    35.             и напиши что-нибудь в $output
    36.             */
    37.             $output = 'I recive: '.$input."\r\n";
    38.             socket_write($client, $output);
    39.         }
    40.         $input = null;
    41.     }
    42.     elseif ($client != null) {
    43.         socket_close($client);
    44.         unset($client);
    45.     }
    46.     socket_set_block($sock);
    47. }
    работает)
     
  7. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    [vs]
    Ладно) пока отложим как вариант) Не разобравшись не могу использовать =)

    Это ситуация нормальная? или может настроено не так)
     
  8. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Это ситуация совсем странная. Может, там какой-то FastCGI который разрешает только один процесс?
    И вообще, такие скрипты как-то неэтично запускать веб-сервером. Их надо в CLI запускать, или кроном.
     
  9. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    [vs]
    понял. спасибо за разъяснения =)