Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
Php - многопоточность на уровне ОС или делаем недетерминированный аппарат |

09.06.2008, 22:55
|
|
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
Провел на форуме: 3008839
Репутация:
1502
|
|
Php - многопоточность на уровне ОС или делаем недетерминированный аппарат
Недавно пришла мне в голову одна идейка, как реализовать в PHP многопоточность. Притом настоящую, а не выдуманную. Заранее предупреждаю, что хоть идея и весьма экстравагантна, но она работает.
Итак, предположим, мы хотим подобрать пароль (в моём упрощённом случае - некое число - идентификатор). Как это можно сделать, используя многопоточность? Делим всё множество вариантов на (почти) равные части, а дальше уже для каждой части выполняем свой поток.
PHP не поддерживает многопоточность. Но PHP позволяет одновременно выполнять на сервере много PHP-скриптов... Поняли мою идею? Наша цель - чтобы php-файл до поры до времени создавал некоторые файлы (дочерние php-скрипты) и запускал их, посредством обращения к серверу, то есть к себе же. Как бы это странно не звучало, но оно работает
Наслаждаемся (только порт не забудте поменять, если надо, на 80):
1.php( название просто так менять НЕЛЬЗЯ!)
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. Приятного просмотра =)
__________________
Bedankt euch dafür bei euch selbst.
H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ
|
|
|

17.06.2008, 14:07
|
|
Новичок
Регистрация: 16.06.2008
Сообщений: 17
Провел на форуме: 23969
Репутация:
0
|
|
Недавно пришла мне в голову одна идейка, как реализовать в PHP многопоточность. Притом настоящую, а не выдуманную.
Никакая это не многопоточность (в том смысле в котором этот термин употребляется в теории многозадачности)
Это бессмысленно довольно, т.к.
1) В php есть форки
2) Для параллельного обслуживания нескольких сетевых подключений есть неблокирующие сокеты (существуют TCP сервера на PHP без использования распараллеливания выполнения с помощью неблокирующих сокетов)
3) Есть другие языки и другие способы выполнить задачи которые ты ставишь и исполняешь через заднее место гораздо более эффективно.
PS Разумеется, способ бредовый, но почему бы не поделиться необычной идеей?
Да, и ты знаешь, эту "идею" я реализовал и описал на этом форуме году этак в 2004ом.
|
|
|

17.06.2008, 14:16
|
|
Познавший АНТИЧАТ
Регистрация: 12.05.2007
Сообщений: 1,235
Провел на форуме: 2238549
Репутация:
1318
|
|
Это бред а не многопоточность, и о каких средствах операционной системы идёт речь?
|
|
|

17.06.2008, 14:46
|
|
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
Провел на форуме: 3008839
Репутация:
1502
|
|
Да что ж вы это так близко к сердцу приняли?  )
Ps А что это, если не многопоточность?
>>>о каких средствах операционной системы идёт речь?
в винде это называется "диспечер процессов и потоков"
__________________
Bedankt euch dafür bei euch selbst.
H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ
|
|
|

18.06.2008, 19:53
|
|
Познавший АНТИЧАТ
Регистрация: 01.05.2006
Сообщений: 1,021
Провел на форуме: 3424739
Репутация:
921
|
|
бред а не статья
|
|
|

18.06.2008, 20:32
|
|
Banned
Регистрация: 06.01.2008
Сообщений: 904
Провел на форуме: 4037638
Репутация:
1821
|
|
Человек поделился своей идеей, а вы бред да бред, не интересно???? Придумайте лучше!
Зачем же так? Он же сам сказал:
Ps Разумеется, способ бредовый, но почему бы не поделиться необычной идеей?
-------------
Спасибо desTiny, почитал  ...будем пробывать....
-------------
|
|
|

18.06.2008, 21:06
|
|
Постоянный
Регистрация: 11.10.2007
Сообщений: 406
Провел на форуме: 7215020
Репутация:
1423
|
|
Приделываем велосипеду крылья от самолета ...
Если разработчики пхп изначально не сделали поддержку многопоточность, значит наверно у них на то были причины, значит не нужна она там нах. А если вам лично нужна многопоточность - учите перл.
|
|
|

18.06.2008, 21:08
|
|
Members of Antichat - Level 5
Регистрация: 25.02.2007
Сообщений: 495
Провел на форуме: 3244717
Репутация:
1980
|
|
значит не нужна она там нах
Php6 будет поддерживать многопоточность
|
|
|

18.06.2008, 21:14
|
|
Постоянный
Регистрация: 11.10.2007
Сообщений: 406
Провел на форуме: 7215020
Репутация:
1423
|
|
Сообщение от [Raz0r]
Php6 будет поддерживать многопоточность
Ну вот и отлично, значит учли многочисленные пожелания кодеров. А к чему весь этот изврат "на уровне ОС" я не понимаю.
Недетерминированный аппарат - гыгыг  я тоже так могу, например : квазипузлистатированный коллапс Вулсторпа ))
|
|
|

19.06.2008, 04:08
|
|
[Лишённый самовыражени
Регистрация: 16.01.2005
Сообщений: 1,787
Провел на форуме: 9751379
Репутация:
3812
|
|
Класс для одновременного открытия нескольких сокетов
PHP код:
<?
class HttpQueue
{
/**
* An array of URLs
*
* @access private
* @var array
*/
private $_urls = array();
/**
* An array of server sockets
*
* @access private
* @var array
*/
private $_sockets = array();
/**
* An array of server responses
*
* @access private
* @var array
*/
private $_response = array();
/**
* Socket timeout
*
* @access private
* @var integer
*/
private $_timeout = 30;
/**
* An array of sockets which can be received
*
* @access private
* @var array
*/
private $_read = array();
/**
* An array of sockets which can be sended
*
* @access private
* @var array
*/
private $_write = array();
/**
* Adds an URL into a tasklist
*
* @access public
* @param string $method
* @param string $url
* @return void
*/
public function add($method, $url)
{
$this->_urls[] = array(strtoupper($method), $this->_parseUrl($url));
}
/**
* Parses requested URL and checks for all URL parts
*
* @access private
* @param string $url
* @return array
*/
private function _parseUrl($url)
{
$parts = parse_url($url);
$parts['port'] = array_key_exists(’port’, $parts) ? $parts['port'] : 80;
$parts['sock'] = sprintf(’%s:%s’, $parts['host'], $parts['port']);
$parts['request'] = sprintf(’%s?%s’, $parts['path'], $parts['query']);
return $parts;
}
/**
* Starts fetch process
*
* @access public
* @param void
* @return array
*/
public function fetch()
{
$this->_create();
$this->_process();
return $this->toArray();
}
/**
* Sets socket timeout (in seconds)
*
* @access public
* @param integer $timeout
* @return void
*/
public function setTimeout($timeout)
{
$this->_timeout = $timeout;
}
/**
* Returns array of server responses
*
* @access public
* @param void
* @return array
*/
public function toArray()
{
return $this->_response;
}
/**
* Creates socket conenctions with hosts given in URL
*
* @access private
* @param void
* @return void
*/
private function _create()
{
foreach ($this->_urls as $id => $connect) {
if ($socket = @stream_socket_client($connect[1]['sock'], $errno,
$errstr, $this->_timeout,
STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT)) {
$this->_sockets[$id] = $socket;
$this->_response[$id] = ‘processing’;
continue;
}
$this->_response[$id] = “failed, $errno $errstr”;
}
}
/**
* Process opened sockets
*
* @access private
* @param void
* @return void
*/
private function _process()
{
while (count($this->_sockets)) {
$this->_read = $this->_sockets;
$this->_write = $this->_sockets;
$select = stream_select($this->_read, $this->_write, $e = null,
$this->_timeout);
if ($select > 0) {
$this->_read();
$this->_write();
}
else {
foreach ($this->_sockets as $id => $s) {
$this->_response[$id] = ‘Timed out’;
}
break;
}
}
}
/**
* Receives data from readable socket
*
* @access private
* @param void
* @return void
*/
private function _read()
{
foreach ($this->_read as $fp) {
$id = array_search($fp, $this->_sockets);
$data = fread($fp, 8192);
if (strlen($data) == 0) {
if ($this->_response[$id] == ‘processing’) {
$this->_response[$id] = ‘failed to connect’;
}
fclose($fp);
unset($this->_sockets[$id]);
}
else {
$this->_response[$id].= $data;
}
}
}
/**
* Sends HTTP request into writeable socket
*
* @access private
* @param void
* @return void
*/
private function _write()
{
foreach ($this->_write as $fp) {
$id = array_search($fp, $this->_sockets);
$method = $this->_urls[$id][0];
$request = $this->_urls[$id][1]['request'];
$host = $this->_urls[$id][1]['host'];
fputs($fp, “$method $request HTTP/1.0rn”);
fputs($fp, “Host: $hostrnrn”);
$this->_response[$id] = ”;
}
}
}
?>
__________________
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|