Недавно пришла мне в голову одна идейка, как реализовать в 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. Приятного просмотра =)
Никакая это не многопоточность (в том смысле в котором этот термин употребляется в теории многозадачности) Это бессмысленно довольно, т.к. 1) В php есть форки 2) Для параллельного обслуживания нескольких сетевых подключений есть неблокирующие сокеты (существуют TCP сервера на PHP без использования распараллеливания выполнения с помощью неблокирующих сокетов) 3) Есть другие языки и другие способы выполнить задачи которые ты ставишь и исполняешь через заднее место гораздо более эффективно. Да, и ты знаешь, эту "идею" я реализовал и описал на этом форуме году этак в 2004ом.
Да что ж вы это так близко к сердцу приняли? ) Ps А что это, если не многопоточность? >>>о каких средствах операционной системы идёт речь? в винде это называется "диспечер процессов и потоков"
Человек поделился своей идеей, а вы бред да бред, не интересно???? Придумайте лучше! Зачем же так? Он же сам сказал: ------------- Спасибо desTiny, почитал...будем пробывать.... -------------
Приделываем велосипеду крылья от самолета ... Если разработчики пхп изначально не сделали поддержку многопоточность, значит наверно у них на то были причины, значит не нужна она там нах. А если вам лично нужна многопоточность - учите перл.
Ну вот и отлично, значит учли многочисленные пожелания кодеров. А к чему весь этот изврат "на уровне ОС" я не понимаю. Недетерминированный аппарат - гыгыг я тоже так могу, например : квазипузлистатированный коллапс Вулсторпа ))
Класс для одновременного открытия нескольких сокетов 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] = ”; } } } ?>