PHP и Threads
April 4th, 2008 zetxxxМдам, имаше и такъв момент, след около 2 часа търсене попаднах на един блог чиито притежател ми изясни някои основни неща включително и че за начинанието за което си мислех че ми трябват нишки мога да мина и без тях. Оказа се че библиотеката която одговрая за стриимовете върши чудесна работа шот имало асинхронна връзка, да ама що толкова малко се пише за тея неща… защото нещата при стриимовете се оказаха малко заплетени, но уви трябваше да се разплетат по един или по друг начин, класа които слагам по долу работи по следния начин ( а и е предназначен главно и само за хттп рикуести ).. сетваме домаин:ппорт( 1 or multiply ) отваряме коннекция -> правиме я асинхронна -> преминаваме от блокинг мод към нонблокинг ( което води до неизчакване ако не се лъжа ) -> stream_select магическата функция, тази фукнция връща резултат в една от опциите които и пассваме по референции, благодарение на тази функция знаем в кои стриим се е случило нещо и благодарение на нея ако трябва да прочетем 2 уеб страници няма да има нужда да чакаме да се изчете едната и селд това другата, така спестяваме времето което е нужно на сървъра да обработи рекуест-а … надявам се съм бил полезен на някои, бв този класс има дребни екстри за поправка, трябваше да сложа услееп някаде за да падне процесорното време но това след уикенд-а, пък и които е заинтересуван винаги ше му бутна рамо
-
ini_set( 'max_execution_time', 300 );
-
-
include 'html.parser.php';
-
-
class threadetSocketCall
-
{
-
var $namespace = array();
-
var $config = array();
-
-
function threadetSocketCall()
-
{
-
$this->config['ctime'] = 30;
-
}
-
-
function mHostAdd( $host_port, $get )
-
{
-
$this->namespace['domain:port'][] = array();
-
$this->namespace['domain:port'][count( $this->namespace['domain:port'] )-1] = $host_port;
-
$this->namespace['get'][count( $this->namespace['domain:port'] )-1] = $get;
-
}
-
-
function mHostAddConnect( $host_port = 'www.belogradchik.biz:80', $get = '' )
-
{
-
$this->mHostAdd( $host_port, $get );
-
$cc = count( $this->namespace['domain:port'] )-1;
-
$this->namespace['conn'][$cc] = stream_socket_client( $this->namespace['domain:port'][$cc], $errno, $errstr, $this->config['ctime'], STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT );
-
stream_set_blocking( $this->namespace['conn'][$cc], 0 );
-
$this->namespace['allready.writed'][$cc] = false;
-
if( !is_resource( $this->namespace['conn'][$cc] ) )
-
{
-
$this->namespace['stat'][$cc]['error_text'] = 'error';
-
$this->namespace['stat'][$cc]['err']['no'] = $errno;
-
$this->namespace['stat'][$cc]['err']['str'] = $errstr;
-
}
-
else
-
$this->namespace['stat'][$cc]['control_text'] = 'in progress >> ';
-
}
-
-
function getResults()
-
{
-
$iter = 0;
-
while( count( $this->namespace['conn'] ) )
-
{
-
++$iter;
-
$r_ = $w_ = array();
-
$r_ = $w_ = $this->namespace['conn'];
-
$n_ = stream_select( $r_, $w_, $e = null, NULL );
-
if( $n_ > 0 )
-
{
-
if( isset( $w_[0] ) )
-
{
-
$w_id = NULL;
-
foreach( $w_ as $id )
-
{
-
$w_id = array_search( $id, $this->namespace['conn'], true );
-
if( $this->namespace['allready.writed'][$w_id] === false )
-
{
-
$this->namespace['stat'][$w_id]['control_text'] .= 'in writeing #'.$w_id.'|'.$iter.'#';
-
fwrite( $this->namespace['conn'][$w_id], $this->namespace['get'][$w_id] );
-
$this->namespace['allready.writed'][$w_id] = true;
-
$this->namespace['output'][$w_id] = '';
-
}
-
}
-
}
-
if( isset( $r_[0] ) )
-
{
-
$r_id = NULL;
-
foreach( $r_ as $id )
-
{
-
$this->namespace['stat'][$id]['control_text'] = 'in reading #'.$iter;
-
$r_id = array_search( $id, $this->namespace['conn'] );
-
$stream_info = stream_get_meta_data( $this->namespace['conn'][$r_id] );
-
$r_data = fread( $this->namespace['conn'][$r_id], 8192 );
-
if( strlen( $r_data ) > 0 ){ $this->namespace['output'][$r_id] .= $r_data; }
-
$r_data = NULL;
-
unset( $r_data );
-
if( $stream_info['eof'] === true )
-
{
-
fclose( $this->namespace['conn'][$r_id] );
-
unset( $this->namespace['conn'][$r_id] );
-
$this->namespace['conn'][$r_id] = NULL;
-
unset( $this->namespace['conn'][$r_id] );
-
}
-
}
-
}
-
}
-
else
-
{
-
break;
-
}
-
}
-
}
-
-
function __destructor()
-
{
-
unset( $this );
-
}
-
}
-
-
$new = new threadetSocketCall();
-
$header = "GET __get__ HTTP/1.1\n".
-
"Host: __host__\n".
-
"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13\n".
-
"Accept-Language: en-us,en;q=0.5\n".
-
"Connection: close\n\n";
-
-
$host = 'localhost';
-
$new->mHostAddConnect( $host.':80', preg_replace( array( '/__host__/i', '/__get__/i' ), array( $host, '/' ), $header ) );
-
$new->getResults();
-
print_r( $new->namespace['output'][0] );
-
# html file to parse
-
$parser = new htmlTagParser();
-
$parser->mSetContent( $new->namespace['output'][0] );
-
$parser->mParseTags( array( 'a', 'title' ) );
-
$aTags = $parser->mGetTags();
-
print_r( $aTags );
-
die();