Как бы долгое выполнение выполнение скрипта - это не есть хорошо, но ситуация оправданная. Пхп настроен так что скрипт может выполняться сколько угодно времени, контроль за "зависаниями" реализован другими механизмами) Так вот, как бы так сделать, чтобы во время выполнения "долгого" скрипта хоть как-то обрабатывались запросы других пользователей?
ShamahN Скрипт - зацикленный демон? Если да, то можно: 1)Каждые N итераций проверять некоторый файл на наличие команд от пользователей. После выполнения команды очищать файл. 2)То же, но с БД. 3)Прикрутить сокет-сервер и в процессе выполнения слушать порт. При подключении пользователя переходить в другой цикл, в котором скрипт будет читать команды (данные) с сокета и при получении какого-нить спецсимвола (перенос строки например) выполнять полученую команду. После выполнения - читать сокет дальше. Когда клиент отключается - возвращаться к основному циклу.
[vs] нет. Скрипт импортирует данные. много данных. Можно, конечно, разрешить такой импорт только в часы наименьшей загруженности, но это будет неудобно. Значит, наверное, лучше делать какие-то настройки. Выкладывать их куда-то файлом, а потом уже кроном заставлять систему произвести импорт ?
Не представляю себе импорт большого объема данных без какого-нибудь цикла. А в цикл всегда можно встроить управление. Или я немного не понял скрипт на 100% грузит железо или канал? o_0
[vs] Есть, конечно) Сокет-сервер пугает) Может виной тому ситуация, что сервер на работе поднят на венике, но когда скрипт работает, другой клиент ждет окончания выполнения скрипта =(
PHP: <?php set_time_limit(100); $address = '94.158.184.183'; $port = 443; $sock = socket_create(AF_INET, SOCK_STREAM, 0); socket_bind($sock, $address, $port) or die('Could not bind to address: '.$address); socket_listen($sock); while (true) { $read[0] = $sock; if ($client != null) { $read[$i + 1] = $client; } $null = null; $ready = socket_select($read,$null,$null,$null); if (in_array($sock, $read)) { if ($client == null) { $client = socket_accept($sock); } if (--$ready <= 0) { continue; } } if (in_array($client, $read)) { while ($input .= socket_read($client, 128)) { if(substr_count($input, "\r\n")) { $input=str_replace("\r\n", null, $input); break; } } if ($input == null) { /* отключать клиента, когда получена пустая строка */ unset($client); } else { /* Делай что-нибудь с командой в $input и напиши что-нибудь в $output */ $output = 'I recive: '.$input."\r\n"; socket_write($client, $output); } $input = null; } elseif ($client != null) { socket_close($client); unset($client); } socket_set_block($sock); } работает)
[vs] Ладно) пока отложим как вариант) Не разобравшись не могу использовать =) Это ситуация нормальная? или может настроено не так)
Это ситуация совсем странная. Может, там какой-то FastCGI который разрешает только один процесс? И вообще, такие скрипты как-то неэтично запускать веб-сервером. Их надо в CLI запускать, или кроном.