Vict0r
Новичок
Если есть более изящные решения, с удовольствием рассмотрю.
Задача: вывод клиентам больших и малых объемов данных, причем обработка новых соединений и вывод малых объемов данных должны происходить непрерывно с максимальной скоростью, в то время как скорость обработки запросов на большие объемы данных не столь критична.
Особенности: некоторые соединения закрываются не сразу после вывода в них малых объемов данных, а какое-то время продолжают быть активными и получают данные от демона.
Самым логичным выходом будет форкать процесс для вывода больших объемов данных. Если я не прав, предложите свой алгоритм.
-~{}~ 07.12.08 22:42:
Проблема с "Interrupted system call" у socket_select() решилась следующим образом:
Но возникла новая проблема - если на демон приходит сразу несколько новых соединений, среди которых есть запрос на вывод большого объема данных (что заставляет родительский процесс форкаться), то некоторые из новых соединений не обрабатываются демоном и остаются "зависшими".
-~{}~ 07.12.08 22:55:
Кстати, версия PHP 4.4.9.
Задача: вывод клиентам больших и малых объемов данных, причем обработка новых соединений и вывод малых объемов данных должны происходить непрерывно с максимальной скоростью, в то время как скорость обработки запросов на большие объемы данных не столь критична.
Особенности: некоторые соединения закрываются не сразу после вывода в них малых объемов данных, а какое-то время продолжают быть активными и получают данные от демона.
Самым логичным выходом будет форкать процесс для вывода больших объемов данных. Если я не прав, предложите свой алгоритм.
-~{}~ 07.12.08 22:42:
Проблема с "Interrupted system call" у socket_select() решилась следующим образом:
PHP:
while( $server_runs )
{
$test_sockets = array();
array_push( $test_sockets, $main_socket );
for( $i = 0; $i < sizeof( $client_sockets ); $i++ )
{
if( isset( $client_sockets[$i] ))
{
array_push( $test_sockets, $client_sockets[$i] );
}
}
$ready = @socket_select( $test_sockets, $_null, $_null, 0 );
if( $ready === false )
{
make_log( "[*ERROR*] Socket_select failed! (" . socket_strerror( socket_last_error()) . ")" );
}
elseif( $ready > 0 )
{
if( in_array( $main_socket, $test_sockets ))
{
$temp = accept_connection( $main_socket );
if( --$ready <= 0 )
continue;
}
for( $i = 0; $i < sizeof( $client_sockets ); $i++ )
{
if( !isset( $client_sockets[$i] )) continue;
if( in_array( $client_sockets[$i], $test_sockets ))
{
$output_data = read_from_socket( $i );
if( !$output_data )
{
@socket_close( $client_sockets[$i] );
$client_sockets[$i] = null;
}
else
{
eval_data( $i, $output_data );
}
}
}
}
usleep( 5000 );
}
-~{}~ 07.12.08 22:55:
Кстати, версия PHP 4.4.9.