LINUX.ORG.RU

php сокеты почему один код медленнее в 6 раз чем другой?

 , ,


0

1

отправляю строку:

   
fwrite($fp, $cfg_message, strlen($cfg_message));

Вариант 1:

    while (($t = fgets ($fp, 1024)) !== false) {
        if(strpos($t,'\r\n') == false)
            $tempbuffer .= $t;        
    }
    echo $tempbuffer;

Вариант 2:

    $tempbuffer = fgets($fp, 1024);
    echo $tempbuffer;

Вариант 2 работает примерно за 1 секунду.

Вариант 1 работает примерно за 60 секунд, такое ощущение что по таймауту.

★★★★★

Пхп не знаю, но я думаю, что $tempbuffer .= $t; это какая-то конкатенация, которая вызывает переаллоцирование на каждой итерации. Наверное лучше заранее какой-то буффер выделять

nikolnik ★★★
()

В первом варианте ты читаешь строку несколько раз (ну или ждешь, когда они появятся), во втором один раз. В $cfg_message добавляешь \r\n?

goingUp ★★★★★
()
Последнее исправление: goingUp (всего исправлений: 1)
Ответ на: комментарий от goingUp

Тогда вопрос, как ждать когда появятся символы и читать строку один раз?

В $cfg_message добавляешь \r\n?

Да и в ответе, она тоже приходит.

sniper21 ★★★★★
() автор топика

бенчи с echo не валидны

anonymous
()

Налепят плохих абстракций и сидят гадают. Ну что за порода.

anonymous
()
Ответ на: комментарий от sniper21

как ждать когда появятся символы и читать строку один раз?

Нужно больше информации. fgets читает строку до \n или до лимита, что ты указал, если данных пока нету, оно их ждет

goingUp ★★★★★
()
Последнее исправление: goingUp (всего исправлений: 1)
Ответ на: комментарий от goingUp

зачем закрывать соединение?

у меня есть хендл - $fp

Как выглядит моя работа с сокетами:

1. открываю соединение, получаю $fp - получаю «ручку». за неё и буду держаться

$fp = fsockopen($host, $port, $errno, $errstr, 1);

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

 echo fgets ($fp);

3. дальше мне надо сразу отправить следующую строку «makeCount\r\n»

fwrite($fp, "makeCount\r\n", strlen("makeCount\r\n"));

на что мне отвечают в два приема:(мне нужно только rawdata)

answer:datasizeinbytes\r\nrawdata

я читаю это так:

$buf = fgets ($fp); //читаю до \r\n
$rec = explode(':', $buf); //
$t = fgets ($fp,$rec[1]); //подставляю в значение, потому что вконце нет \r\n 

на этапе получения данных всегда приходит разное(!) количество, но так быть недолжно.

И в конце закрываю соединение:

fclose($fp);

sniper21 ★★★★★
() автор топика
Ответ на: комментарий от sniper21

Если тебе просто нужно прочитать определенное количество байт используй fread вместо второго fgets. Почему ждет fgets из кода в ОП я уже отвечал.

goingUp ★★★★★
()
Последнее исправление: goingUp (всего исправлений: 1)
Ответ на: комментарий от goingUp

определенное количество байт используй fread вместо второго fgets.

Победа была тут! Спасибо.

sniper21 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.