Forum Webscript.Ru

Программирование => PHP => Тема начата: obytatel от 27 Апреля 2003, 02:33:32

Название: как организовать многопоточность (другого слова не смог выдумать)
Отправлено: obytatel от 27 Апреля 2003, 02:33:32
как организовать многопоточность (другого слова не смог выдумать)
Проблема:
Ныне мой скрипт ПОСЛЕДОВАТЕЛЬНО открывает соединения с удаленными хостами и производит однородные действия. То есть: отработал с одним хостом - взялся за другой.
Нужно:
Чтобы скрипт ОДНОВРЕМЕННО работал с несколькими хостами (5-10), т.е. более плотно использовал канал.
Вот и вся трабла. Если можно - киньте пример кода.
:insane:
Название: как организовать многопоточность (другого слова не смог выдумать)
Отправлено: Макс от 27 Апреля 2003, 03:00:39
ИМХО тут лучше взять Perl или Python

Если на php - то я пока вижу 2 варианта
 - register_tick_function (не советую)
 - pcntl_* (управление процессами - не работал)

Вроде неблокирующие сокеты могут помочь, но я их не юзал.
Название: как организовать многопоточность (другого слова не смог выдумать)
Отправлено: FreeSpace от 27 Апреля 2003, 14:03:05
Как альтернатива, можно клиентом (просто браузером) запустить несколько скриптов с set_time_limit(0) и ignore_user_abort(true).
Сходи вот сюда:
http://www.php.net/ignore_user_abort
И не забудь почитать комментсы!
Название: как организовать многопоточность (другого слова не смог выдумать)
Отправлено: D1g174LM4n14c от 28 Апреля 2003, 13:20:18
А лимит сервера на выполнение скриптов? PHP скрипт все равно не сможет выполняться НЕОГРАНИЧЕННОЕ количество времени... только если на сервере ограничения не установлены... а обычно так не делают...
Название: как организовать многопоточность (другого слова не смог выдумать)
Отправлено: Макс от 28 Апреля 2003, 13:29:03
D1g174LM4n14c
[off] нужно хостинг выбирать под задачу. Если ему нужен скрипт без ограничения времени исполнения, значит нужно выбирать подходящего хостера [/off]
Название: как организовать многопоточность (другого слова не смог выдумать)
Отправлено: Maniac от 28 Апреля 2003, 17:00:09
obytatel
Я это делал средствами UNIX\'a.
Т.е. в теле скрипта команда `php myscript.php &`, но это работает только если он ничего не вводит и ничего не выводит. Обычно такой скрипт может выполняться секунд 15
Название: как организовать многопоточность (другого слова не смог выдумать)
Отправлено: D1g174LM4n14c от 28 Апреля 2003, 18:40:31
Макс
[OFF]
не каждого сисадмина уговоришь лимит убрать...
а вдруг ты рассылкой спама заниматься будешь? =)
[/OFF]
Название: как организовать многопоточность (другого слова не смог выдумать)
Отправлено: FreeSpace от 28 Апреля 2003, 20:04:39
D1g174LM4n14c
[off]Ну любой нормальный сисадмин по логам отличит рассылку спама от другой, более (без)обидной деятельности ;)[/off]
А вообще я предложил такой способ просто как альтернативу...
Название: как организовать многопоточность (другого слова не смог выдумать)
Отправлено: obytatel от 29 Апреля 2003, 00:59:15
а вариантов с вызовом функций или модулей без ожидания возврата результатов нет?
Название: как организовать многопоточность (другого слова не смог выдумать)
Отправлено: FreeSpace от 29 Апреля 2003, 01:11:20
Насколько я знаю, нет.
Хотя можешь попробовать запихнуть функцию в отдельный файл, а потом вызывать его вот так:
$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 пусть пишет все ошибки/результаты в лог, который потом можно будет посмотреть.
Хотя по-моему это всё-же извращение...
Название: как организовать многопоточность (другого слова не смог выдумать)
Отправлено: Макс от 29 Апреля 2003, 02:07:54
Цитировать
а вариантов с вызовом функций или модулей без ожидания возврата результатов нет?
попробуй это (http://php.spb.ru/php/run_background_process.html)
Название: как организовать многопоточность (другого слова не смог выдумать)
Отправлено: Макс от 29 Апреля 2003, 18:19:45
вот кстати еще есть http://cvs.php.net/cvs.php/pear/PECL/threads
Только ни один админ на рабочий сервер это не поставит