@Mussi

Php. Постоянный цикл внутри скрипта и вывод информации на экран через веб. Пока цикл не завершится, вывода не будет. Что делать ?

Стоит задача, постоянно, раз например в 40 секунд сверять последнюю полученную дату с датой из бд, и выводить последнюю полученную дату на экран, дату хранить в переменной.
Реализовал цилом вайл(тру нужные мне действия, но встала проблема, при вызове скрипта из консоли все нормально, раз в 40 секунд он выдает дату, однако при обращении к скрипту из веба, он уходит в бесконечный цикл и само собой ниче не показывает, в итоге апач по таймауту выдает 500ю ошибку.
Мне хотелось бы чтоб при обращении к скрипту из веба ( клиент будет посылать ajax запрос), он выдавал последнюю полученную дату и на этом выполнение скрипта завершалось. Это реально ?
<?php
$newdate = date('h:i:s');

function checknew($getdate)
{
global $newdate;
$conn = oci_connect("tratata", "tralala", "//172.10.22.21:1521/info");
$sql = "select * from last_date"; 
$res = OCIParse($conn, $sql);
oci_execute($res);
$row = oci_fetch_row($res);
if ($row[0] !== $getdate)
$newdate = $row[0];
}
while(true){
usleep(40000000);
checknew($newdate);
echo "<b>".$newdate."</b>"; 
}
?>
  • Вопрос задан
  • 3091 просмотр
Решения вопроса 1
morozovdenis
@morozovdenis
напишите скрипт на пхп, который делает только это:
checknew($newdate);
echo $newdate;


потом на javascript делайте запрос с помощью ajax с интервалом 40 секунд и обновляйте html
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
@Mussi "куча клиентов" это сколько?
В чем смысл данного скрипта?

Во первых как написали выше правильный запрос это
select date_column  from last_date ORDER BY date_column DESC LIMIT 1

где date_column - название вашей колонки с датой.
разумеется по ней должен быть индекс.
если есть первичный ключ и сортировка по нему совпадает с сортировкой по date_column то что бы не заводить лишний индекс можно сделать сортировку по первичному ключу.

Во вторых в качестве стартового решения - можно действительно сделать это в лоб на ajax.

В третьих - дать реальную нагрузку и посмотреть куда оно упрется.
Варианты
а) в базу. в этом случае делаем следующее:
ставим redis/memcache/что угодно по вкусу.
далее два варианта:
тупой:
делаем cron скрипт который выполняет указанный выше sql запрос и кладет результат в базу.
скрипт который дергается по ajax переделываем что бы он брал данные из redis
минус решения - данные возможно иногда будут запаздывать.
умный:
переписываем логику приложения которая обновляет поле date_column что бы при обновлении поля оно клалось в redis
б)упрется в производительность веб сервера (более вероятно на мой взгляд)
Правильное решение (кстати в любом случае правильное) - не использовать ajax вообще, а использовать сокеты. Можно это сделать на php ( habrahabr.ru/post/41223 habrahabr.ru/company/ifree/blog/209864 habrahabr.ru/company/bitrix/blog/198540 ), можно это сделать на node.js - там чуть нативнее и есть отличная библиотека socket.io
Получение данных правильно сделать так: на старте демона получаем данные из sql (один раз), далее как в варианте 2.умный если данные менются - логика приложения шлет особый запрос в демон, демон рассылает изменение всем подключенным клиентам.
Получается мгновенное обновление данных при минимальной нагрузке к бд и основному веб серверу.

Спасибо пожалуйста.
Ответ написан
4ikist
@4ikist
… ORDER BY date_column DESC LIMIT 1
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Depcon Екатеринбург
от 100 000 до 170 000 ₽
ManyChat Москва
от 150 000 ₽
от 210 000 до 250 000 ₽