Авторские статьи Php - многопоточность на уровне ОС или делаем недетерминированный аппарат

Discussion in 'Статьи' started by desTiny, 9 Jun 2008.

  1. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    Недавно пришла мне в голову одна идейка, как реализовать в 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 $name;   //строим хип
        
    $name2 $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. Приятного просмотра =)
     
    5 people like this.
  2. Novi4ek

    Novi4ek New Member

    Joined:
    16 Jun 2008
    Messages:
    12
    Likes Received:
    3
    Reputations:
    -5
    Никакая это не многопоточность (в том смысле в котором этот термин употребляется в теории многозадачности)

    Это бессмысленно довольно, т.к.
    1) В php есть форки
    2) Для параллельного обслуживания нескольких сетевых подключений есть неблокирующие сокеты (существуют TCP сервера на PHP без использования распараллеливания выполнения с помощью неблокирующих сокетов)
    3) Есть другие языки и другие способы выполнить задачи которые ты ставишь и исполняешь через заднее место гораздо более эффективно.

    Да, и ты знаешь, эту "идею" я реализовал и описал на этом форуме году этак в 2004ом.
     
  3. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Это бред а не многопоточность, и о каких средствах операционной системы идёт речь?
     
  4. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    Да что ж вы это так близко к сердцу приняли? :))

    Ps А что это, если не многопоточность?
    >>>о каких средствах операционной системы идёт речь?
    в винде это называется "диспечер процессов и потоков"
     
  5. Sharky

    Sharky Elder - Старейшина

    Joined:
    1 May 2006
    Messages:
    487
    Likes Received:
    312
    Reputations:
    46
    бред а не статья
     
  6. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Человек поделился своей идеей, а вы бред да бред, не интересно???? Придумайте лучше!
    Зачем же так? Он же сам сказал:
    -------------
    Спасибо desTiny, почитал:)...будем пробывать....
    -------------
     
    1 person likes this.
  7. ElteRUS

    ElteRUS Elder - Старейшина

    Joined:
    11 Oct 2007
    Messages:
    367
    Likes Received:
    460
    Reputations:
    93
    Приделываем велосипеду крылья от самолета ...
    Если разработчики пхп изначально не сделали поддержку многопоточность, значит наверно у них на то были причины, значит не нужна она там нах. А если вам лично нужна многопоточность - учите перл.
     
  8. [Raz0r]

    [Raz0r] Elder - Старейшина

    Joined:
    25 Feb 2007
    Messages:
    425
    Likes Received:
    484
    Reputations:
    295
    Php6 будет поддерживать многопоточность
     
  9. ElteRUS

    ElteRUS Elder - Старейшина

    Joined:
    11 Oct 2007
    Messages:
    367
    Likes Received:
    460
    Reputations:
    93
    Ну вот и отлично, значит учли многочисленные пожелания кодеров. А к чему весь этот изврат "на уровне ОС" я не понимаю.

    Недетерминированный аппарат - гыгыг :D я тоже так могу, например : квазипузлистатированный коллапс Вулсторпа ))
     
    1 person likes this.
  10. +toxa+

    +toxa+ Smack! SMACK!!!

    Joined:
    16 Jan 2005
    Messages:
    1,674
    Likes Received:
    1,029
    Reputations:
    1,228
    Класс для одновременного открытия нескольких сокетов
    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($fp8192); 

                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] = ;
            }
        }
    }
    ?>
     
    _________________________
    2 people like this.