ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи > Авторские статьи
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Php - многопоточность на уровне ОС или делаем недетерминированный аппарат
  #1  
Старый 09.06.2008, 22:55
Аватар для desTiny
desTiny
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 $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. Приятного просмотра =)
__________________
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
 
Ответить с цитированием

  #2  
Старый 17.06.2008, 14:07
Аватар для Novi4ek
Novi4ek
Новичок
Регистрация: 16.06.2008
Сообщений: 17
Провел на форуме:
23969

Репутация: 0
По умолчанию

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

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

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

  #3  
Старый 17.06.2008, 14:16
Аватар для groundhog
groundhog
Познавший АНТИЧАТ
Регистрация: 12.05.2007
Сообщений: 1,235
Провел на форуме:
2238549

Репутация: 1318


Отправить сообщение для groundhog с помощью ICQ
По умолчанию

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

  #4  
Старый 17.06.2008, 14:46
Аватар для desTiny
desTiny
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
 
Ответить с цитированием

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

Репутация: 921


Отправить сообщение для Sharky с помощью ICQ
По умолчанию

бред а не статья
 
Ответить с цитированием

  #6  
Старый 18.06.2008, 20:32
Аватар для De-visible
De-visible
Banned
Регистрация: 06.01.2008
Сообщений: 904
Провел на форуме:
4037638

Репутация: 1821


Отправить сообщение для De-visible с помощью ICQ
По умолчанию

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

  #7  
Старый 18.06.2008, 21:06
Аватар для ElteRUS
ElteRUS
Постоянный
Регистрация: 11.10.2007
Сообщений: 406
Провел на форуме:
7215020

Репутация: 1423
По умолчанию

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

  #8  
Старый 18.06.2008, 21:08
Аватар для [Raz0r]
[Raz0r]
Members of Antichat - Level 5
Регистрация: 25.02.2007
Сообщений: 495
Провел на форуме:
3244717

Репутация: 1980
Отправить сообщение для [Raz0r] с помощью ICQ
По умолчанию

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

  #9  
Старый 18.06.2008, 21:14
Аватар для ElteRUS
ElteRUS
Постоянный
Регистрация: 11.10.2007
Сообщений: 406
Провел на форуме:
7215020

Репутация: 1423
По умолчанию

Цитата:
Сообщение от [Raz0r]  
Php6 будет поддерживать многопоточность
Ну вот и отлично, значит учли многочисленные пожелания кодеров. А к чему весь этот изврат "на уровне ОС" я не понимаю.

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

  #10  
Старый 19.06.2008, 04:08
Аватар для +toxa+
+toxa+
[Лишённый самовыражени
Регистрация: 16.01.2005
Сообщений: 1,787
Провел на форуме:
9751379

Репутация: 3812


Отправить сообщение для +toxa+ с помощью ICQ Отправить сообщение для +toxa+ с помощью AIM
По умолчанию

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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хакер и закон! SladerNon Болталка 17 12.11.2009 09:42
Хакеры и кракеры или "Что такое хорошо и что такое плохо?" foreva Чужие Статьи 12 09.02.2008 12:26
Обнаружение Sql инъекций и Css атак k00p3r Чужие Статьи 0 12.06.2005 20:43
PHP vs mod_rewrite Trinux PHP, PERL, MySQL, JavaScript 11 13.05.2005 21:25
Нужен скрипт на php или perl, проверяющий прокси и Чаты 0 05.10.2004 23:04



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ