Forum Webscript.Ru
Программирование => PHP => Тема начата: obytatel от 27 Апреля 2003, 02:33:32
-
как организовать многопоточность (другого слова не смог выдумать)
Проблема:
Ныне мой скрипт ПОСЛЕДОВАТЕЛЬНО открывает соединения с удаленными хостами и производит однородные действия. То есть: отработал с одним хостом - взялся за другой.
Нужно:
Чтобы скрипт ОДНОВРЕМЕННО работал с несколькими хостами (5-10), т.е. более плотно использовал канал.
Вот и вся трабла. Если можно - киньте пример кода.
:insane:
-
ИМХО тут лучше взять Perl или Python
Если на php - то я пока вижу 2 варианта
- register_tick_function (не советую)
- pcntl_* (управление процессами - не работал)
Вроде неблокирующие сокеты могут помочь, но я их не юзал.
-
Как альтернатива, можно клиентом (просто браузером) запустить несколько скриптов с set_time_limit(0) и ignore_user_abort(true).
Сходи вот сюда:
http://www.php.net/ignore_user_abort
И не забудь почитать комментсы!
-
А лимит сервера на выполнение скриптов? PHP скрипт все равно не сможет выполняться НЕОГРАНИЧЕННОЕ количество времени... только если на сервере ограничения не установлены... а обычно так не делают...
-
D1g174LM4n14c
[off] нужно хостинг выбирать под задачу. Если ему нужен скрипт без ограничения времени исполнения, значит нужно выбирать подходящего хостера [/off]
-
obytatel
Я это делал средствами UNIX\'a.
Т.е. в теле скрипта команда `php myscript.php &`, но это работает только если он ничего не вводит и ничего не выводит. Обычно такой скрипт может выполняться секунд 15
-
Макс
[OFF]
не каждого сисадмина уговоришь лимит убрать...
а вдруг ты рассылкой спама заниматься будешь? =)
[/OFF]
-
D1g174LM4n14c
[off]Ну любой нормальный сисадмин по логам отличит рассылку спама от другой, более (без)обидной деятельности ;)[/off]
А вообще я предложил такой способ просто как альтернативу...
-
а вариантов с вызовом функций или модулей без ожидания возврата результатов нет?
-
Насколько я знаю, нет.
Хотя можешь попробовать запихнуть функцию в отдельный файл, а потом вызывать его вот так:
$addr = $HTTP_SERVER_VARS[\'SERVER_ADDR\'];
$port = $HTTP_SERVER_VARS[\'SERVER_PORT\'];
$script_path = "/functions/some_mail_func.php";
$params = "?from=My+Name&to=My+Client";
$fp = fsockopen ($addr, $port, $errno, $errstr, 30);
if (!$fp)
die("$errstr ($errno)
\\n");
$headers = "GET $script_path HTTP/1.0\\r\\n".
"Host: ". $addr . $params ."\\r\\n\\r\\n";
fputs ($fp, $headers);
// Сюда можно вставить код получения ответа от сервера!
fclose ($fp);
Ну и ещё можно запихнуть это в цикл и вызывать эту функцию несколько раз не дожидаясь ответа от сервера.
А файл по $script_path пусть пишет все ошибки/результаты в лог, который потом можно будет посмотреть.
Хотя по-моему это всё-же извращение...
-
а вариантов с вызовом функций или модулей без ожидания возврата результатов нет?
попробуй это (http://php.spb.ru/php/run_background_process.html)
-
вот кстати еще есть http://cvs.php.net/cvs.php/pear/PECL/threads
Только ни один админ на рабочий сервер это не поставит