Guten Tag liebe PHPler,
ich habe eine kleine MVC Implementation mit integriertem HTTP Server geschrieben. Diese funktioniert soweit. Das Problem besteht darin den Status des Sockets abzufragen. In POST Requests die nicht mit einem identifizierbarem Ende aufhören kann ich so nicht auslesen ohne vorher ihre Bytelänge zu kennen.
Das Script wartet solange bis Daten nach gesendet werden, dies wird aber nicht geschehen.
Und zwar geht es hier um die statische funktion readFromSocket die bis zu einem \n ( Zeilenumbruch liest ) und dann aufhört und den gelesenden String zurück gibt. Das Problem ist wie gesagt das beim letzten lesen kein Zeilenumbruch ist und er unendlich ( bzw. timeout ) auf ein weiteres Byte wartet.
ich habe eine kleine MVC Implementation mit integriertem HTTP Server geschrieben. Diese funktioniert soweit. Das Problem besteht darin den Status des Sockets abzufragen. In POST Requests die nicht mit einem identifizierbarem Ende aufhören kann ich so nicht auslesen ohne vorher ihre Bytelänge zu kennen.
Das Script wartet solange bis Daten nach gesendet werden, dies wird aber nicht geschehen.
PHP-Code:
<?php
class Server_Socket {
private $socket;
private $response;
private $request;
private $disp;
public $dbs;
public function __construct() {
$this->socket = socket_create_listen( Server_Config::PORT );
socket_set_nonblock( $this->socket );
$this->dbs = new Server_Pool_Database;
Server_Cron::init();
//Alle Crons einrichten
Server_Cron::add( array( $this->dbs, "check" ), ( 5 * 60 ) );
Server_Cron::add( "Server_Statistic::createShot", ( 15 * 60 ) );
Server_Cron::add( "Server_Session::checkSessions", 60 );
if( PHP_OS != 'WINNT' ) {
$fork = new Server_Fork( Server_Config::CHILDS, $this );
}
else {
$this->listen();
}
}
public function listen() {
$this->response = new Server_Http_Response;
$this->request = new Server_Http_Request;
$this->disp = new MVC_Dispatcher;
if( PHP_OS == 'WINNT' ) {
while( 1 ) {
Server_Cron::handle( );
while( $conn = @socket_accept( $this->socket ) ) {
socket_set_block( $conn );
$this->handleRequest( $conn );
}
}
}
else {
while( 1 ) {
while( $conn = @socket_accept( $this->socket ) ) {
socket_set_block( $conn );
$this->handleRequest( $conn );
}
}
}
}
public static function readFromSocket( $conn, $end = array( "\n" => "" ) ) {
$ret = "";
do {
$read = socket_read( $conn, 1 );
$ret .= $read;
} while( !isset( $end[$read] ) );
return $ret;
}
private function handleRequest( $conn ) {
try {
$start = microtime( true );
$this->request->reset();
$this->request->newRequest( $conn );
$this->response->reset();
$this->response->httpCode( 200 );
if( !isset( $this->request->path['extension'] ) || in_array( $this->request->path['extension'], $this->disp->supported() ) ) {
$this->disp->root( $this->request, $this->response );
$this->response->send( $conn );
}
elseif( isset( Server_Mime::$mime[$this->request->path['extension']] ) ) {
$this->response->setHeader( "Content-Type", Server_Mime::$mime[$this->request->path['extension']] );
$this->response->sendFile( "www/". $this->request->conf['main']['document-root'] ."/static/". $this->request->url['path'], $conn );
}
else {
$this->response->httpCode( 404 );
$this->response->setContent( 'File not Found!' );
$this->response->send( $conn );
}
}
catch( Server_Http_Exception $e ) {
$this->response->reset();
$this->response->httpCode( $e->getCode() );
$this->response->setContent( $e->getMessage() );
$this->response->send( $conn );
}
}
}
?>
Kommentar