desTiny
09.06.2008, 22:55
Недавно пришла мне в голову одна идейка, как реализовать в PHP многопоточность. Притом настоящую, а не выдуманную. Заранее предупреждаю, что хоть идея и весьма экстравагантна, но она работает.
Итак, предположим, мы хотим подобрать пароль (в моём упрощённом случае - некое число - идентификатор). Как это можно сделать, используя многопоточность? Делим всё множество вариантов на (почти) равные части, а дальше уже для каждой части выполняем свой поток.
PHP не поддерживает многопоточность. Но PHP позволяет одновременно выполнять на сервере много PHP-скриптов... Поняли мою идею? Наша цель - чтобы php-файл до поры до времени создавал некоторые файлы (дочерние php-скрипты) и запускал их, посредством обращения к серверу, то есть к себе же. Как бы это странно не звучало, но оно работает:)
Наслаждаемся (только порт не забудте поменять, если надо, на 80):
1.php(название просто так менять НЕЛЬЗЯ!)
<?php //Coded by desTiny :-)
$start=0;
$end=100;
ini_set("max_execution_time",0);
function check($id){
if (file_exists("f.txt")){
if ($name!=1)unlink(__FILE__);
die();
}
if ($id == 79){
if ($name!=1)unlink(__FILE__);
file_put_contents("f.txt", $id);
die();
}
}
(isset($_GET['name']) && is_numeric($_GET['name']) && ($_GET['name'] > 0)) ? $name=$_GET['name'] : $name = 1;
if ($end - $start < 10)
for (; $start <= $end; $start++)
check($start);
else{
$name1 = 2 * $name; //строим хип
$name2 = 2 * $name + 1;
$st = round(($start + $end)/2);
$f = file("$name.php");
$f[1]="\$start=$start;\r\n";
$f[2]="\$end=$st;\r\n";
file_put_contents("$name1.php", $f);
$st++;
$f[1]="\$start=$st;\r\n";
$f[2]="\$end=$end;\r\n";
file_put_contents("$name2.php", $f);
$ock=fsockopen("127.0.0.1",8080);
$path=dirname($_SERVER['PHP_SELF']);
$p="GET $path\\$name1.php?name=$name1 HTTP/1.1\r\n".
"Host: 127.0.0.1\r\n".
"\r\n";
fputs($ock, $p);
fclose($ock);
$ock=fsockopen("127.0.0.1",8080);
$p="GET $path\\$name2.php?name=$name2 HTTP/1.1\r\n".
"Host: 127.0.0.1\r\n".
"\r\n";
fputs($ock, $p);
fclose($ock);
}
if ($name!=1)unlink(__FILE__);
?>
Функция check проверяет переданный ей id. У меня это - банальное сравнение с 79, но могло быть что угодно.
Ответ скрипта смотрим в файле "f.txt"
PS Разумеется, способ бредовый, но почему бы не поделиться необычной идеей? :)
(c)С вами был desTiny. Приятного просмотра =)
Итак, предположим, мы хотим подобрать пароль (в моём упрощённом случае - некое число - идентификатор). Как это можно сделать, используя многопоточность? Делим всё множество вариантов на (почти) равные части, а дальше уже для каждой части выполняем свой поток.
PHP не поддерживает многопоточность. Но PHP позволяет одновременно выполнять на сервере много PHP-скриптов... Поняли мою идею? Наша цель - чтобы php-файл до поры до времени создавал некоторые файлы (дочерние php-скрипты) и запускал их, посредством обращения к серверу, то есть к себе же. Как бы это странно не звучало, но оно работает:)
Наслаждаемся (только порт не забудте поменять, если надо, на 80):
1.php(название просто так менять НЕЛЬЗЯ!)
<?php //Coded by desTiny :-)
$start=0;
$end=100;
ini_set("max_execution_time",0);
function check($id){
if (file_exists("f.txt")){
if ($name!=1)unlink(__FILE__);
die();
}
if ($id == 79){
if ($name!=1)unlink(__FILE__);
file_put_contents("f.txt", $id);
die();
}
}
(isset($_GET['name']) && is_numeric($_GET['name']) && ($_GET['name'] > 0)) ? $name=$_GET['name'] : $name = 1;
if ($end - $start < 10)
for (; $start <= $end; $start++)
check($start);
else{
$name1 = 2 * $name; //строим хип
$name2 = 2 * $name + 1;
$st = round(($start + $end)/2);
$f = file("$name.php");
$f[1]="\$start=$start;\r\n";
$f[2]="\$end=$st;\r\n";
file_put_contents("$name1.php", $f);
$st++;
$f[1]="\$start=$st;\r\n";
$f[2]="\$end=$end;\r\n";
file_put_contents("$name2.php", $f);
$ock=fsockopen("127.0.0.1",8080);
$path=dirname($_SERVER['PHP_SELF']);
$p="GET $path\\$name1.php?name=$name1 HTTP/1.1\r\n".
"Host: 127.0.0.1\r\n".
"\r\n";
fputs($ock, $p);
fclose($ock);
$ock=fsockopen("127.0.0.1",8080);
$p="GET $path\\$name2.php?name=$name2 HTTP/1.1\r\n".
"Host: 127.0.0.1\r\n".
"\r\n";
fputs($ock, $p);
fclose($ock);
}
if ($name!=1)unlink(__FILE__);
?>
Функция check проверяет переданный ей id. У меня это - банальное сравнение с 79, но могло быть что угодно.
Ответ скрипта смотрим в файле "f.txt"
PS Разумеется, способ бредовый, но почему бы не поделиться необычной идеей? :)
(c)С вами был desTiny. Приятного просмотра =)