Постоянная связь бровзера с РНР скриптом

  • Автор темы MKardash
  • Дата начала

MKardash

Guest
Постоянная связь бровзера с РНР скриптом

Есть одна хитрая задачка.
Её суть во в чём:
------------------------------------------------------
\шаг 1\ Бровзер открывает соединение с сервером
\шаг 2\ Сервер он же некий РНР скрипт отдаёт ответ бровзеру, но не отключаэтся (ждёт какого нибудь изменения - файл создался, или в базу чтото дописали)
\шаг 3\ Если сервер дождался изменения то сразу же говорит серверу рефрешнуть страницу
\шаг 4\ Соответственно бровзер делает рефреш
------------------------------------------------------
Меня интересуют все возможные варианты решения такой задачки.
Один из вариантов я уже нашол, но он не очень красивый, в РНР скрипте таймера (загружается в iframe главной страницы)
ставится неограниченый таймаут - set_time_limit (0); и при определённом событии таймер закрывается и даёт команду посредством Java Script перегрузить главное окно. Исходники смотрите ниже.
============================
скрипт таймера: timer.php
PHP:
<?php
  error_reporting (E_ALL);
  set_time_limit (0);
  ob_implicit_flush ();
  $start_time = time();
  $end_time = $start_time + (100);
  $curr_time = $start_time;
  $period = 1;
  $in_period = 0;

  while (1) {  
  
    if($prew_now != $now) {
        $in_period++;
        if($in_period >= $period) {
            if(is_file("./some.txt")) {
                echo ' <script language="JavaScript">
                        <!--
                            parent.location.reload();
                        //-->
                        </script>';
            exit;
            }
            $in_period = 0;
        }
        $prew_now = $now;
    } 
  }
 ?>
============================
скрипт емуляции события: file.php
PHP:
<?php
if(!is_file("./some.txt")) {
    $handle = fopen("./some.txt", "w");
    fclose($handle);
} else {
    unlink("./some.txt");
}
    echo 'Is file '.is_file("./some.txt");

?>
============================
скрипт главной странички: index.php
PHP:
<?php
session_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Untitled Document</title>
</head>
<body>
<IFRAME src="timer.php" width="0" height="0"
           scrolling="auto" frameborder="0">
           
</IFRAME>
<?php
if(!isset($_SESSION['what_is'])) {
    $_SESSION['what_is'] = 0;
    echo 'I can not found any vars!<br>';
} else {
    $_SESSION['what_is']++;
    echo 'I found var "what_is" - '.$_SESSION['what_is'].'!';
}
    echo '<hr>Is file '.is_file("./some.txt");
?>
</body>
</html>
============================
 

ARN

Guest
скрипт живет во время обращения к нему... без рефреша не отловиш изменения
 

MKardash

Guest
Да ето я понимаю, вот и тот пример что выше выложил работает токо на приём даных с сервера и в результате получается постоянное зависание бровзера до определения какогото события. Меня интересуэт не только чистое РНР решение а и возможности соединения используя возможно какихто других технологий, лиш бы не ставить бровзер на периодический рефреш(ето попса и неинтерестно). Было бы в идеале если б клиент устанавливал связь сервером через какой нить сокет или чтото типа того, но протокол HTTP не особо способствуе етому и мне нужны хо какието зацепки для реализации такй связи.
 

MKardash

Guest
Кроме аплета, использования activex компонент, нужно чтото нестандартное, необычное решение
 

untied

Сдвинутый новичок
Чем тебе апплет не нравится?

Есть и еще более нестандартное решение: создать собственный протокол, поддерживающий непрерывное соединение, и под него создать сервер и клиентский браузер...
 

Yurik

/dev/null
Не нужно нестандартных необычных решений. нужно писать демона на чем угодно (есть и на РНР) который будет сам принимать и держать конекты от обыкновенного броузера используя функции работы с сокетами.
На готовое решение на языке TCL смотри chat.php.spb.ru
 
Сверху