Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Авторские статьи (https://forum.antichat.xyz/forumdisplay.php?f=31)
-   -   Php - многопоточность на уровне ОС или делаем недетерминированный аппарат (https://forum.antichat.xyz/showthread.php?t=73234)

desTiny 09.06.2008 22:55

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 $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. Приятного просмотра =)

Novi4ek 17.06.2008 14:07

Цитата:

Недавно пришла мне в голову одна идейка, как реализовать в PHP многопоточность. Притом настоящую, а не выдуманную.
Никакая это не многопоточность (в том смысле в котором этот термин употребляется в теории многозадачности)

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

Цитата:

PS Разумеется, способ бредовый, но почему бы не поделиться необычной идеей?
Да, и ты знаешь, эту "идею" я реализовал и описал на этом форуме году этак в 2004ом.

groundhog 17.06.2008 14:16

Это бред а не многопоточность, и о каких средствах операционной системы идёт речь?

desTiny 17.06.2008 14:46

Да что ж вы это так близко к сердцу приняли? :))

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

Sharky 18.06.2008 19:53

бред а не статья

De-visible 18.06.2008 20:32

Человек поделился своей идеей, а вы бред да бред, не интересно???? Придумайте лучше!
Зачем же так? Он же сам сказал:
Цитата:

Ps Разумеется, способ бредовый, но почему бы не поделиться необычной идеей?
-------------
Спасибо desTiny, почитал:)...будем пробывать....
-------------

ElteRUS 18.06.2008 21:06

Приделываем велосипеду крылья от самолета ...
Если разработчики пхп изначально не сделали поддержку многопоточность, значит наверно у них на то были причины, значит не нужна она там нах. А если вам лично нужна многопоточность - учите перл.

[Raz0r] 18.06.2008 21:08

Цитата:

значит не нужна она там нах
Php6 будет поддерживать многопоточность

ElteRUS 18.06.2008 21:14

Цитата:

Сообщение от [Raz0r]
Php6 будет поддерживать многопоточность

Ну вот и отлично, значит учли многочисленные пожелания кодеров. А к чему весь этот изврат "на уровне ОС" я не понимаю.

Недетерминированный аппарат - гыгыг :D я тоже так могу, например : квазипузлистатированный коллапс Вулсторпа ))

+toxa+ 19.06.2008 04:08

Класс для одновременного открытия нескольких сокетов
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] = ;
        }
    }
}
?>



Время: 16:35