Как я могу запустить php-скрипт с таймером?

У меня есть функции foreach, которые печатают имена учеников

$names = array("Alex","Brad","Tom");
foreach($names as $name) {
   echo "$name <br />";
   sleep(3);
}

Как я могу печатать каждое имя каждые 3 секунды? После "echo $name" мне нужен таймер, чтобы остановить цикл и подождать 3 секунды. sleep() функции здесь не работают. Что еще я могу сделать?


person user829149    schedule 27.07.2011    source источник
comment
посмотрите на ob_flush() и flush()   -  person Haim Evgi    schedule 27.07.2011
comment
Это в командной строке или на веб-странице?   -  person Jim    schedule 27.07.2011


Ответы (5)


Вы не можете сделать это на стороне сервера (надежно). Это связано с тем, что слишком велика вероятность того, что ваш трафик будет удерживаться или буферизоваться в пути: веб-сервером, прокси-серверами по пути, вашим браузером и т. д. Однако это, вероятно, будет работать в CLI.

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

Если это только для «косметических» целей, вы можете создать метод AJAX, который будет возвращать массив имен, а затем Javascript выводит их с помощью своих таймеров.

Или вы можете заставить AJAX вызывать PHP-скрипт с помощью таймеров, и PHP вернет только одно имя. Он может сохранить текущую метку времени в БД или в переменной сеанса и не возвращать новое имя, пока не пройдет некоторое время.

person Palantir    schedule 27.07.2011

попробуйте использовать функцию flush

ob_start();    
$names = array("Alex","Brad","Tom");
foreach($names as $name) {
   echo "$name <br />";
   ob_flush();
   flush();    
   sleep(10);
}
person Haim Evgi    schedule 27.07.2011

Если вам нужно сделать это на веб-странице, вам нужно очистить вывод или отключить буферизацию вывода, чтобы получить эту работу. Некоторые ссылки:

В php CLI этот код будет работать.

person Fabio    schedule 27.07.2011

Вы можете сделать это с помощью javascript, ajax

или с помощью функции flush()

<?php
$names = array("Alex","Brad","Tom");
foreach($names as $name) {
   echo "$name <br />";
   flush();
   sleep(3);
}

рабочая демонстрация

person genesis    schedule 27.07.2011
comment
Это не правда. Вы можете сделать это, даже если я думаю, что это плохая практика. - person Fabio; 27.07.2011
comment
@Fabio: у меня это работает на одном сервере, но не на втором. Как это возможно? - person genesis; 27.07.2011
comment
Это зависит от вашей конфигурации php.ini, попробуйте также добавить вызов ob_flush(). - person Fabio; 27.07.2011
comment
посмотрите на php.ini php_value output_buffering 0 - person Haim Evgi; 27.07.2011
comment
Потому что в своем первом ответе вы сказали, что это невозможно. - person Fabio; 27.07.2011
comment
Я отредактировал ваш вопрос (удалив оскорбительную строку) и удалил отрицательный голос :-) - person Fabio; 27.07.2011
comment
Если вы используете CLI, функция flush() не нужна, исходный код будет работать как есть. - person Fabio; 27.07.2011
comment
@Fabio: И что именно означает этот CLI? Что это? Это какое-то расширение? Тип PHP? - person genesis; 27.07.2011
comment
Интерфейс командной строки, т. е. запуск php-скриптов из оболочки - person Fabio; 27.07.2011
comment
Он печатает все через 9 секунд (3 имени х 3 секунды), а до этого страница пуста... - person user829149; 27.07.2011
comment
@ user829149: это означает, что вы должны отключить output_buffering в php.ini - person genesis; 27.07.2011

Вы можете написать flush(); после echo

person lazyhammer    schedule 27.07.2011