Очистка буфера
Проблема
Операция вывода через файловый манипулятор выполняется не сразу. Из-за того могут возникнуть
проблемы в сценариях CGI на некоторых Web-серверах, враждебных по отношению к программисту.
Если Web-сервер получит предупреждение от Perl до того, как увидит (буферизованный) вывод
вашего сценария, он передает броузеру малосодержательное сообщение «500 Server Error».
Проблемы буферизации возникают при одновременном доступе к файлам со стороны нескольких
программ и при взаимодействии с устройствами или сокетами.
Решение
Запретите буферизацию, присвоив истинное значение (обычно 1) переменной $| на уровне
файлового манипулятора:
$old_fh = select(OUTPUT_HANDLE);
$| = 1;
select($old_fh);
Или, если вас не пугают последствия, вообще запретите буферизацию вызовом метода
autoflush из модулей IO:
use IO::Handle;
OUTPUT_HANDLE->autoflush(1);
Комментарий
В большинстве реализаций stdio буферизация определяется типом выходного устройства.
Для дисковых файлов применяется блочная буферизация с размером буфера, превышающим 2 Кб.
Для каналов (pipes) и сокетов часто применяется буфер размера от 0,5 до 2 Кб. Последовательные
устройства, к числу которых относятся терминалы, модемы, мыши и джойстики, обычно буферизуются
построчно; stdio передает всю строку лишь при получении перевода строки.
Функция Perl print не поддерживает по-настоящему
небуферизованного вывода — физической записи
каждого отдельного символа. Вместо этого поддерживается командная буферизация, при которой
физическая запись выполняется после каждой отдельной команды вывода. По сравнению с полным
отсутствием буферизации обеспечивается более высокое быстродействие, при этом выходные
данные получаются сразу же после вывода.
См. также
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|