Форум программистов, компьютерный форум, киберфорум
PHP: сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772

fsockopen() периодически зависает

01.04.2013, 15:42. Показов 2861. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня!
Ситуация следующая:
Через php и fsockopen() отправляю запрос (1000 байт) на сервер и получаю ответ (1000 байт) примерно раза 3-4 в секунду.
Каждый запрос-ответ сопровождается созданием сокета и его закрытием.
Наблюдаю картину, что через некоторое время (~39000 итераций) fsockopen() зависает... т.е. обмен обрывается, т.к. последующий запрос осуществляется после успешного выполнения предыдущего. При повторной попытке все возобновляется, т.е. получается что дело не в серверной части. Серверная часть работает для теста локально - маленькая программа получения-отправки.
Т.к. зависание происходит периодически, то может быть существует какой-то буфер у пхп/апач?
Кто-нибудь связывался с подобным эффектом?

Добавлено через 53 минуты
Заметил, что IEXPLORER.EXE съедает по чуть-чуть память, то было 36000 КБ, то уже 43000 КБ скушано (минут за 20-30)... хотя я в циклически выполняется только php код....

Добавлено через 3 минуты
на 44040 КБ выполнение остановилось....

Добавлено через 1 минуту
Нажал повторно старт - программа продолжила работать, память продолжила расти от 44040 КБ

Добавлено через 28 минут
Похоже, что проблема не в браузере, а также и не в сервере... что же, товарищи, подскажи? Плииззз)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.04.2013, 15:42
Ответы с готовыми решениями:

fsockopen() зависает
Зделал PHP скрипт на денвер: $fp = fsockopen(127.0.0.1,583, $errno, $errstr, 10); if (!$fp) echo "$errstr ($errno)<br...

Warning: fsockopen() [function.fsockopen]
Warning: fsockopen() : unable to connect to :0 (Failed to parse address "") in Z:\home\amm.su\WWW\modules\icq\icq.class.php on line 88 ...

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

13
87 / 87 / 8
Регистрация: 02.09.2012
Сообщений: 510
01.04.2013, 16:28
кушает память? Кода вы нам не дали, но открывши ресурс(соединение) его надо закрыватб
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
01.04.2013, 21:55  [ТС]
Я закрываю соединение после каждого открытия сокета. Сижу с планшета, вечером выложу код. Спасибо за готовность помочь

Добавлено через 5 часов 4 минуты
Файл connect.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?
    $key='0';
    $fp1=0;
    $fp1 = fsockopen("192.168.0.10",1234,$errno,$errstr);
    if($fp1)
    {
        $ii=0;
        $data='';
        for($i=0;$i<1000;$i++)
        {
            $ii=$i&0xff;
            $data.=pack("C",$ii);
        }
        fputs($fp1,$data);
        $data='';
        $data = fread($fp1,1000);
        $data_s=bin2hex($data);
        $key='1';
        fclose($fp1);
    }
    echo json_encode($key);
?>
Файл myscript.js

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$iii=0;
$(document).ready(function()
{
          $("#btn0").click(function(){
              //$intervalId = setInterval(work_ajax,50);
              work_ajax();
          });          
          $("#cancel").click(function(){
                //clearInterval($intervalId);
                $iii=0;
          })
});
function work_ajax()
{ 
    var inp0 = $("#inp0").val();
    $.ajax({
        type: "POST",
        data: "key=" + $iii,
        url: "connect.php",
        dataType: "json",
        success: function(data)
        {
            if(data=='1') $("#inp1").val($iii++);
            else          $("#inp1").val(0);
            work_ajax();
        }
    })
}
Добавлено через 6 минут
Код пишется для функционирования 24/7, а сбой происходит меньше чем через час
Подскажите, может где что-то неправильно написано?

Добавлено через 3 минуты
В fsockopen(..) отсутствует параметр timeout... В экспериментах его пользовал со значениями, 30, 100 и 10000 - не помогало..
0
87 / 87 / 8
Регистрация: 02.09.2012
Сообщений: 510
01.04.2013, 23:07
вы в функции work_ajax на клиенте вызываете ее же рекурсивно не зависимо от того что вернул вам серверный скрипт. переполнение стека. посмотрите внимательно условие
JavaScript
1
2
3
if(data=='1') $("#inp1").val($iii++);
else          $("#inp1").val(0);
work_ajax();// будет вызываться всегда пока не повесится
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
01.04.2013, 23:47  [ТС]
Но погодите, независимо от того, что вернет пхп, повторно вызывается work_ajax() при успешном выполнении ajax. А где переполняется стек в моем случае?
0
87 / 87 / 8
Регистрация: 02.09.2012
Сообщений: 510
02.04.2013, 08:41
обработчик success вызывается не после завершения функции ajax, а непосредственно перед ее завершением. Он находится в теле функции. поэтому у вас не повторный вызов функции, а бесконечная рекурсия. если вам требуется бесконечный обмен данными с сервером, наверно лучше это делать по таймеру...
1
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
02.04.2013, 10:13  [ТС]
Спасибо огромнейшее за совет!
А подскажите, как подобное можно реализовать через таймер?

Добавлено через 1 час 12 минут
поставил в ajax функцию, которая выводит сообщение при неудачном выполнении:
JavaScript
1
2
3
4
error: function()
{
      $("#inp1").val("Error ajax");
}
Процесс остановился через некоторое время с этой ошибкой.
Можно ли узнать что именно было причиной этой ошибки?
0
87 / 87 / 8
Регистрация: 02.09.2012
Сообщений: 510
02.04.2013, 12:40

Не по теме:

ничесе написал ответ, а он куда-то пропал


для реализации таймера в js есть функции setTimeout и clearTimeout.
а насчет ошибки надо смотрть доки той js библиотеки которой вы пользуетесь.. не знаю
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
02.04.2013, 17:49  [ТС]
Спасибо, буду экспериментировать
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
03.04.2013, 20:28  [ТС]
Добрый вечер!
Нахожусь в глубокой депрессии...
Начал изучать web и нахожусь в глубоком непонимании как все работает... Эксперименты не увенчались успехом.
Прошу посмотреть на мой код... или я дун-дук что-то не учел, либо так нельзя просто-напросто делать...

Код С++ программки - сервера (арбайтен на Линуксе), который обрабатывает запросы и генерит ответ:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
...создание переменных...
...создание сокета...
...привязка сокета...
while(work_main)
{
    //---Socket Initialization
    //------S_TCP1 (SEND)-------------
    s_send=0;
    FD_ZERO(&for_select_connect);
    FD_SET (s_tcp1, &for_select_connect);
    time_out_connect.tv_sec  = 0;
        time_out_connect.tv_usec = 0;
    res_new1 = select (s_tcp1+1,&for_select_connect, NULL, NULL, &time_out_connect);
        if (res_new1!=0) // If status of socket is changing from OFF to ON
        {
          if ((s_send = accept(s_tcp1, (struct sockaddr *__restrict)&name_clnt1,(socklen_t *)&name_clnt_len))<0)
          {
              sleep(1);
              continue;
          }
          else
          {
              FD_ZERO (&for_select_read);FD_SET (s_send, &for_select_read);
              time_out_read.tv_sec = 0;time_out_read.tv_usec = 0;
              res_read=select (s_send+1, &for_select_read, NULL, NULL, &time_out_read);
              if (res_read!=0)
              {
                msg_len=0;
                accum_flag_read:
                msg_len+= recv(s_send, buff_rcv, MSG_BUFF,0);
                if(msg_len==MSG_BUFF)
                {
                    printf("Receive......OK\n");
                }
                else
                {
                    printf("Not full packet RCV\n");
                    goto accum_flag_read;
                }
                FD_ZERO (&for_select_write);FD_SET (s_send, &for_select_write);
                time_out_write.tv_sec = 0;time_out_write.tv_usec = 0;
                res_write=select (s_send+1, NULL, &for_select_write, NULL, &time_out_write);
 
                if (res_read!=0)
                {
                    for(int ii=0;ii<MSG_BUFF;ii++)
                    {
                        buffer_write[ii]=ii&0xff;
                    }
                    msg_len=0;
                    accum_flag_write:
                    msg_len += send(s_send, buffer_write, MSG_BUFF,0);
                    if(msg_len==MSG_BUFF)
                    {
                        printf("Send.........OK\n");
                    }
                    else
                    {
                        printf("Not full packet SND\n");
                        goto accum_flag_write;
                    }
                 }
              }
              close(s_send);
          }
          s_send=-1;
        }
        else
        {
            usleep(1);
        }
}
Код html-ки:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=windows-1251" />
    <meta name="author" content="qwerty" />
    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript" src="myscript.js"></script>
    <title>1</title>
</head>
 
<body>
     <p>1:</p>
     <p><input type="text" id="inp0"> 
     <input type="button" value="Connect" id="btn0">
     <input type="button" value="Cancel" id="cancel"></p>
     <p>2:</p>
     <p><input type="text" id="inp1"></p>
     <p><input type="text" id="inp2"></p>
     <p><input type="text" id="inp3"></p>
     <p><input type="text" id="inp4"></p>
     <p id="p1"></p>
</body>
</html>
Код javascript:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
$iii=0;
$(document).ready(function()
{
          $("#btn0").click(function(){
              $intervalId = setInterval(work_ajax,50);
          });          
          $("#cancel").click(function(){
                clearInterval($intervalId);
                $iii=0;
          })
});
function work_ajax()
{ 
    var inp0 = $("#inp0").val();
    $.ajax({
        type: "POST",
        data: "key=" + $iii,
        url: "connect.php",
        dataType: "json",
        timeout: "10000",
        success: function(data)
        {
            if(data=='1') 
            {
                $("#inp0").val($iii++);
            }
            else
            {
                $("#inp0").val("Error socket");
            }
        },
        error: function(request,status,error)
        {
            $("#inp1").val($iii++);
            $("#inp2").val(error);
            $("#inp3").val(status);
            $("#inp4").val(request);
        }
    })
}
Код PHP:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<? 
    $key='0';
    $fp1=0;
    $fp1 = fsockopen("192.168.0.222",1234,$errno,$errstr,30);
    if($fp1)
    {
        $ii=0;
        $data='';
        for($i=0;$i<1200;$i++)
        {
            $ii=$i&0xff;
            $data.=pack("C",$ii);
        }
        //write_flag:
        fputs($fp1,$data);
        //$wr=0;
        //$wrl+=fwrite($fp1,$data,1200);
        /*if($wrl!=1200)
        {
            goto write_flag;
        }*/
        $data='';
        read_flag:
        $data = fread($fp1,1200);
        if($data==false)
        {
            goto read_flag;
        }
        $data_s=bin2hex($data);
        $key='1';
        fclose($fp1);
    }
    echo json_encode($key);
?>

Через несколько секунд после нажатия кнопки запуска, начинают увеличиваться счетчик ошибок, httpd.exe грузит core-i7 на 100%... Только помогает перезагрузка OpenServer'a... Что я делаю не так? ...дико запутался...
0
03.04.2013, 20:38

Не по теме:

на цпп вы что-то похожее на демон написали(или сервис вин) который постоянно в памяти. Если вы на пхп запустите скрипт с бесконечным таймаутом, то скорее всего его либо скинут, либо его скинут и еще дополнительно вы будете иметь разговор с хостером... Чем ваша служба на цпп не устраивает?

0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
03.04.2013, 20:40  [ТС]
У меня по команде должен постоянно работать обмен с программой на С++ с отображением в браузере... По команде она должна останавливаться...
0
03.04.2013, 20:53

Не по теме:

это веб сервисы. я в аут, сори

0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
03.04.2013, 21:35  [ТС]
Может быть я заблуждаюсь, но в чем мой подход плох?
Я хочу гонять между цпп и php "сырые" данные, сформированные на мое личное усмотрение, те структуру кадра придумал сам. Не хочу использовать xml, http, и кучу других протоколов... Поэтому и использую сокеты... Жаль, что никто не может подсказать выход из ситуации
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.04.2013, 21:35
Помогаю со студенческими работами здесь

Компьютер периодически зависает.
Собрал машину со следующими параметрами: мать - Mb Socket 775 MSI P41T-C31 Soc-775 iP41 DDRII ATX SATA AC'97 8ch LAN-Gbt проц - cpu...

Периодически зависает компьютер
Ребята как определить какая область моего железа барахлит. В общем проблема вот в чем: с компом какие то непонятные проблемы, он может...

Намертво периодически зависает пк
Было две проблемы Внезапный зависания пк во время простоя, игры, фильмов, серфинга интернета. - Актуальна При запуске Aida64 или cpu-z...

Периодически зависает компьютер
Дело такое. КОгда юзаю пк , через некоторое время он начинает зависать по 5сек ( просто стоит , не на что не реагирует) потом его отпускает...

MineCraft периодически зависает
Kogda ja igraju v Minecraft u menja igra zavisaet i ne otwisaet,no kogda ja tolko skacal minecraft u menja ona voopse ne zawisala.V ciom...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru