S0meT1me
19.09.2010, 15:32
I ВСТУПЛЕНИЕ
PHP относится к языкам программирования, в которых поддержка многопоточности отсутствует. Но, существует немало задач, где она необходима. В рамках тематики данного форума это могут быть брутеры, спамеры, граберы, чекеры, инвайтеры, гулялки, заливщики.
Сразу отмечу, эмулировать многопоточность будем для работы с сетью, не для вычислительных процессов и прочего (ИМХО - здесь PHP не пригоден как интерпритируемый язык в связи со скоростью его выполнения).
Итак, рассмотрим способы реализации многопоточности в ПХП.
1. Многопоточность можно реализовать внутри вашего скрипта, создав список неблокирующих сокетов и переодически проверяя отработал поток или нет.
Такой подход подробно рассмотрен здесь (http://habrahabr.ru/blogs/php/40245/) . Стоит так же отметить, такой же подход использует класс функций multi_ библиотеки CURL.
2. Второй метод основан на эмуляцции многопоточности, используя многозадачность. Другими словами, наш скрипт просто запускает нужное число процессов, распределяя между ними входные данные нужным образом. Этот метод впервые был предложен на ачате здесь (https://antichat.live/threads/73234/) , так же интересная реализация этого метода предложена здесь (http://domaintimes.net/forum/showthread.php?t=7378) .
Я пошёл по второму пути, развил и доработал его. Разработанный скрипт распределяет входные данные, может работать с несколькими исполняемыми скриптами одновременно, собирает результаты работы скриптов по их завершению.
II РЕАЛИЗАЦИЯ
Функция для запуска эмуляции многопоточности
threads_create(
$threads,//число потоков
$copy_files,//файлы, нужные для работы аждого потока
$create_files,//исходные данные, которые ужно распределить между отоками
$run_files,//исполняемые файлы в рамка х каждого потока
$implode_files//результирующие данные, сф рмированные каждым из по оков, которые нужно собра ть в 1 файл
)
Вкратце алгоритм работы:
В результате работы функция создаёт папки для каждого потока, копирует туда нужные для работы файлы, разделяет данные между этими папками и запускает каждый исполняемый скрипт. По завершению работы скрипт сохраняет результирующие данные в файл в своей папке, а когда все скрипты отработают, софт соберёт результирующие данные из указанных файлов и разместит их в файле с тем же именем в папке со скриптом. Все созданные промежуточные файлы и папки удаляются.
functionthreads_create($threads,$copy_files,$creat e_files,$run_files,$implode_files=array() ) {
$cfs= array();
foreach($create_filesas$fname=>$content) {
if( !is_array($content) ) {
$content=file2array($fname);
} else {
}
$cfs[$fname] =array_rand_slice($content,$threads);
}
$bat="@echo off\ncd thread0\n";
$tdir='threads-'.randstr(5);
mkdir($tdir);
chdir($tdir);
for($i=0;$i$fname)
copy('../'.$fname_from,$dir.'/'.$fname);
foreach(array_keys($cfs) as$fname )
file_put_contents($dir.'/'.$fname,str_replace("\n\n","\n",implode("\n",$cfs[$fname] [$i] ) ) );
$bat.="cd ..\\thread{$i}\n";
foreach($run_filesas$fname=>$params)
$bat.="start php$fname$params\n";
}
file_put_contents('run.bat',$bat);
exec('run.bat');
unlink('run.bat');
foreach($implode_filesas$if) {
$contents= array();
for($i=0;$i'do.php',//какие файлы копировать в папку к каждому потоку
),
array(
'accs.txt'=>'accs.txt',//какие файлы содержат данн ые, что надо равномерно р спределить между всеми п токами
),
array(
'do.php'=>'',//исполняемые файлы с набор ом параметров
),
array(
'accs.good.txt',//файл гуд акков, который н до собрать в результате аботы каждого из потоков
'accs.bad.txt'//файл бед акков
)
);
}
Спасибо за внимание.
PHP относится к языкам программирования, в которых поддержка многопоточности отсутствует. Но, существует немало задач, где она необходима. В рамках тематики данного форума это могут быть брутеры, спамеры, граберы, чекеры, инвайтеры, гулялки, заливщики.
Сразу отмечу, эмулировать многопоточность будем для работы с сетью, не для вычислительных процессов и прочего (ИМХО - здесь PHP не пригоден как интерпритируемый язык в связи со скоростью его выполнения).
Итак, рассмотрим способы реализации многопоточности в ПХП.
1. Многопоточность можно реализовать внутри вашего скрипта, создав список неблокирующих сокетов и переодически проверяя отработал поток или нет.
Такой подход подробно рассмотрен здесь (http://habrahabr.ru/blogs/php/40245/) . Стоит так же отметить, такой же подход использует класс функций multi_ библиотеки CURL.
2. Второй метод основан на эмуляцции многопоточности, используя многозадачность. Другими словами, наш скрипт просто запускает нужное число процессов, распределяя между ними входные данные нужным образом. Этот метод впервые был предложен на ачате здесь (https://antichat.live/threads/73234/) , так же интересная реализация этого метода предложена здесь (http://domaintimes.net/forum/showthread.php?t=7378) .
Я пошёл по второму пути, развил и доработал его. Разработанный скрипт распределяет входные данные, может работать с несколькими исполняемыми скриптами одновременно, собирает результаты работы скриптов по их завершению.
II РЕАЛИЗАЦИЯ
Функция для запуска эмуляции многопоточности
threads_create(
$threads,//число потоков
$copy_files,//файлы, нужные для работы аждого потока
$create_files,//исходные данные, которые ужно распределить между отоками
$run_files,//исполняемые файлы в рамка х каждого потока
$implode_files//результирующие данные, сф рмированные каждым из по оков, которые нужно собра ть в 1 файл
)
Вкратце алгоритм работы:
В результате работы функция создаёт папки для каждого потока, копирует туда нужные для работы файлы, разделяет данные между этими папками и запускает каждый исполняемый скрипт. По завершению работы скрипт сохраняет результирующие данные в файл в своей папке, а когда все скрипты отработают, софт соберёт результирующие данные из указанных файлов и разместит их в файле с тем же именем в папке со скриптом. Все созданные промежуточные файлы и папки удаляются.
functionthreads_create($threads,$copy_files,$creat e_files,$run_files,$implode_files=array() ) {
$cfs= array();
foreach($create_filesas$fname=>$content) {
if( !is_array($content) ) {
$content=file2array($fname);
} else {
}
$cfs[$fname] =array_rand_slice($content,$threads);
}
$bat="@echo off\ncd thread0\n";
$tdir='threads-'.randstr(5);
mkdir($tdir);
chdir($tdir);
for($i=0;$i$fname)
copy('../'.$fname_from,$dir.'/'.$fname);
foreach(array_keys($cfs) as$fname )
file_put_contents($dir.'/'.$fname,str_replace("\n\n","\n",implode("\n",$cfs[$fname] [$i] ) ) );
$bat.="cd ..\\thread{$i}\n";
foreach($run_filesas$fname=>$params)
$bat.="start php$fname$params\n";
}
file_put_contents('run.bat',$bat);
exec('run.bat');
unlink('run.bat');
foreach($implode_filesas$if) {
$contents= array();
for($i=0;$i'do.php',//какие файлы копировать в папку к каждому потоку
),
array(
'accs.txt'=>'accs.txt',//какие файлы содержат данн ые, что надо равномерно р спределить между всеми п токами
),
array(
'do.php'=>'',//исполняемые файлы с набор ом параметров
),
array(
'accs.good.txt',//файл гуд акков, который н до собрать в результате аботы каждого из потоков
'accs.bad.txt'//файл бед акков
)
);
}
Спасибо за внимание.