Сокет сервер загрузка процессора!!!

bepkyt

Новичок
Сокет сервер загрузка процессора!!!

При запуске скрипта сокет сервера под WinXP(PHP 5.2.0)
(из статьи http://ru.php.net/manual/ru/function.socket-select.php#56241)
Поцессор показывает загрузку процессора на 99%
В чём может быть проблема?
Это без подключения клиентов
Просто скрипт работает в фоновом режиме
какая из функций грузит процессор
Заранее благодарен!
 

Solid

Drosera anglica
bepkyt
Вы читали о socket_select? Заметили предполений и последний аргумент?

-~{}~ 08.12.06 19:18:

Так же будте осторожны, максимальное кол-во возможных подключений равно 1-о байтовому integer'у (256)
 

bepkyt

Новичок
о спасибо огромное я просто не дочитал статью до конца
каюсь:)
спасиба за подсказку про таймаут

-~{}~ 11.12.06 12:24:

Подскажите а почему максимальное количество клиентов 256?
простите если что за ламерство:)

-~{}~ 13.12.06 15:42:

Solid
почему возможное количество подключений 256???
 

CMD

Новичок
товарищи! помогите точно такая же проблема как у топикстартера.

создается 40 неблокируемых сокетных соединений

PHP:
function nonBlockingConnect($host, $port, &$errno, &$errstr, &$restime) 
{
    $start = getmicrotime();
    $ip = gethostbyname($host);
    $restime = getmicrotime() - $start;
    $restime = round($restime, 6);

    $s = socket_create(AF_INET, SOCK_STREAM, 0);
    if (socket_set_nonblock($s)) {
	    $r = @socket_connect($s, $ip, $port);
	    if ($r || (socket_last_error($s) == INPROGRESS)) {
	        $errno = INPROGRESS;
            return $s;
	    }
    } else {    
        $errno = socket_last_error($s);
        $errstr = socket_strerror($errno);
        socket_close($s);
        return false;
    }
}
далее они выбираются socket_select() 'ом
$n = socket_select($read, $write, $except = NULL, 0);

в результате чего апач прыгает под 99% загрузки процессора.
тестировал этот же код под линухом, и там никаких заметных нагрузок не наблюдалось.


перегуглил уже тучу информации, никак не могу найти солюшена! :(
 

bepkyt

Новичок
to CMD
Попробуй
socket_select($read, $write = NULL, $except = NULL,0,10)

-~{}~ 18.12.06 18:33:

to CMD

В посте
http://phpclub.ru/talk/showthread.php?s=&threadid=85604&highlight=socketconnect

раскажите как вы сделали мулти подключения 40 клиентов

подскажите как сделать простое подключение к серверу 40 клиентов одновременно!!!!

Заранее благодарен!!!
 

CMD

Новичок
да с паузами уже пробовал играть, почти не помогает. решил забить, работать будет все равно под линухом, там нагрузки не наблюдается.


а насчет 40 подключений, там впринципе в коде все описано, он полностью рабочий ( та проблема что там была, возникла изза ошибки в настройках оси сервера)


только если урлов много для операции то лучче их ставить в очередь и мониторить состояние (закрывать, открывать новые итп)
 

bepkyt

Новичок
to CMD
можете подсказать алгоритм подключения множества
клиентов к однму хосту
потому что не совсем понимаю как работает socket_select
и я хочу протестировать сервер на загрузку множеством клиентов
ЗАРАНЕЕ БЛАГОДАРЕН!!!
 

bepkyt

Новичок
to boombick
а тему почитать слабо?
я имею ввиду тестирование сокет сервера
 

phprus

Moderator
Команда форума
bepkyt
А в чем проблема? Разве http-сервер - не является сокет сервером? Или тебе не нравиться, что твоему серверу будут отправляться http запросы?
 

bepkyt

Новичок
если не ошибаюсь boombick предлагает
протестить Apache
он является сокет сервером, просто не о нём речь в данной теме.


Solid написал выше что могут только 256 клиентов подключится к сокет серверу на php
вот я и пытаюсь сей факт проверить
а у меня не получается подключить одновременно множество клиентов, не ладится с socket_select
не совсем понятно его роль в подключении множества клиентов
 

phprus

Moderator
Команда форума
bepkyt
Ошибаешся. ab абсолютно безразлично какой сервер находится на другом конце. Так что man ab поможет тебе узнать какие параметры надо передавать ab чтобы он отправлял запросы к твоему серверу.
 

bepkyt

Новичок
я бы с радостью :) просто я под виндой
и про ab не особо в курсе
 

bepkyt

Новичок
попробывал
работает
но не хотит паралельно подключатся к сокетами
подключается по очереди
вот экран

New 1 clients connected: 127.0.0.1
client disconnected.
New 1 clients connected: 127.0.0.1
client disconnected.
New 1 clients connected: 127.0.0.1
client disconnected.
New 1 clients connected: 127.0.0.1
client disconnected.
New 1 clients connected: 127.0.0.1
client disconnected.
New 1 clients connected: 127.0.0.1
client disconnected.
New 1 clients connected: 127.0.0.1
client disconnected.

я написал простейшего клиента на пхп, который подключается к сокет серверу и запустил

C:\Program Files\Apache Software Foundation\Apache2.2\bin>ab -n 100 -c 100 http:
//localhost:8080/socket_client.php
Результат процессор 100% загрузки
в процессах штук 10 интерпритаторов php-cgi
либо такой вариант не подходит
или я что-то не так делаю?
Помогите протестировать PHP Socket Server!!!

Можно же написать по аналогии сервера
мулти подключения множества клиентов

я пробовал NetCat подключаться
нормально подключается 5 клиентов правда

Как эмулировать средствами пхп мулти подключение?

-~{}~ 20.12.06 18:22:

С помошью socket_select пытаюсь создать список подключенных клиентов
ругается

Warning: socket_connect() [function.socket-connect]: unable to connect [0]: Сделан запрос на подключение для уже подключенного сокета. in D:\WORK\PHP_Lessons\klient_conn.php on line 25

убрал сокет_коннект из цикла
ругается

Warning: socket_select(): supplied argument is not a valid Socket resource in D:\WORK\PHP_Lessons\klient_conn.php on line 37

В чём может быть проблема?
 

Solid

Drosera anglica
bepkyt
Что-то не совсем понятно, что вы хотите. К этому серверу подключаться надо через telnet. После того, как вы что-то ему пошлёте, то он автоматически закрывает соединение.
Перед тем, как подключаться, его (сервер) надо запустить в командной строке.
 

bepkyt

Новичок
усё сделал использовал пример гуру
http://netevil.org/node.php?nid=280&SC=1

но проблема с загрузкой процессора осталась
при подключении одновременно 200 клиентов к одному хосту
загрузка состовляет 100%

нужно с timeoutом играться?
 

whirlwind

TDD infected, paranoid
bepkyt притормози и еще раз перечитай свой топик сначала. То ты тестируешь сервер, то клиента. Ты с помощью ab тестируешь клиента и удивляешься почему у тебя после

>ab -n 100 -c 100 http://localhost:8080/socket_client.php

>>Результат процессор 100% загрузки
>>в процессах штук 10 интерпритаторов php-cgi

? Ну так а что ты собственно хотел?

У тебя кто с socket_select работает клиент или сервер? Если сервер, то курить [m]socket_bind[/m], [m]socket_listen[/m] и какую нибудь статью про сервер.

Т.к. socket_select у тебя не блокирующий, прога гоняет цикл и загружает проц под 100%. Если нет клиентов (т.е. сокет один всего) надо вызывать блокирующий accept.
 

bepkyt

Новичок
вот последовательность действий
написал небольшой сервер похожий на
http://ru.php.net/manual/ru/functio...elect.php#56241)

при запуске загружал процессор
исправил таймаут
socket_select($read, $write = NULL, $except = NULL,0,10)
пошло нормально

дальше я решил проверить этот сервер на загрузку клиентами
написал мултиклиента с помощью статьи
http://netevil.org/node.php?nid=280&SC=1

а там клиенты подключаются с помощью
$s = stream_socket_client($host_port, $errno, $errstr, $timeout,

и снова грузится процессор на 100%
и незнаю толи сервер грузит, то ли клиенты

Как вы думаете
может из-за того что сервер ждёт данных от клиентов?
 
Сверху