Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при подключении модуля Time, Premature end of script headers 
:(
    Опции темы
vechik
Дата 15.2.2010, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 4.2.2010

Репутация: нет
Всего: нет



Есть такой код

Код

#!/usr/bin/perl -w
use strict;
#use warnings;
use diagnostics;
use DBI;
use CGI qw(:all);
#use CGI::Carp 'fatalsToBrowser';
print header( -charset => 'Windows-1251');
use Time::HiRes qw ( time ); # qw(gettimeofday tv_interval);
#$t1=time;

...

Если убираю комментарий из последней строки, то в логах получаю такую запись: Premature end of script headers.
Подозреваю, то на сервере используется версия Perl 5.8.8, а эти функции включены начиная с версии 5.10.1.
Может, кто посоветует, что делать?
А задача - подсчитать интервал времени в мс выполнения блока программы.
PM MAIL   Вверх
sir_nuf_nuf
Дата 15.2.2010, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



Обычно это бывает когда переводы строки после заголовков HTTP забыли вывести.

Покажите весь скрипт


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
arto
Дата 15.2.2010, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



а он у вас есть, Time::HiRes ?
PM MAIL ICQ   Вверх
mvsgt
Дата 15.2.2010, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 27.3.2009

Репутация: 1
Всего: 1



Обычно такие ошибки исправляются, имитируя вызов скрипта сервером. Сделайте это, и узнаете что происходит. Конечно, можно и потелепатировать.
PM MAIL   Вверх
DurRandir
Дата 15.2.2010, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



>>> use strict;
perldoc strict 

Это очень полезная прагма, прочитайте, что она НЕ даёт вам делать, и что из этого вы делаете в скрипте.
PM   Вверх
vechik
Дата 15.2.2010, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 4.2.2010

Репутация: нет
Всего: нет



Цитата(vechik @ 15.2.2010,  09:49)
Есть такой код

#!/usr/bin/perl -w
use strict;
#use warnings;
use diagnostics;
use DBI;
use CGI qw(:all);
#use CGI::Carp 'fatalsToBrowser';
print header( -charset => 'Windows-1251');
use Time::HiRes qw ( time ); # qw(gettimeofday tv_interval);
#$t1=time;
...

Если убираю комментарий из последней строки, то в логах получаю такую запись: Premature end of script headers.
Подозреваю, то на сервере используется версия Perl 5.8.8, а эти функции включены начиная с версии 5.10.1.
Может, кто посоветует, что делать?
А задача - подсчитать интервал времени в мс выполнения блока программы.


Вот так получилось, но выдает секунды
...
my $result = eval{use Time::HiRes; my $t1=time;};
print "$result ------ $@";
...
А так
...
my $result = eval{use Time::HiRes; my ($s,$mks)=gettimeofday();};
print "$result ------ $@";
...
выдало 
------ Undefined subroutine &main::gettimeofday called at _index1.pl line 12. 


Это сообщение отредактировал(а) vechik - 15.2.2010, 13:35
PM MAIL   Вверх
mvsgt
Дата 15.2.2010, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 27.3.2009

Репутация: 1
Всего: 1



vechik, Вам уже намекали насчёт use strict. #$t1=time; есть, а my $t1; нет. И Вы упорно не хотите выполнить скрипт без браузера и апача, просто из командной строки?
PM MAIL   Вверх
vechik
Дата 16.2.2010, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 4.2.2010

Репутация: нет
Всего: нет



Ошибку нашел. Функцию надо писать со всеми префиксами. А также отдельно объявить переменные для дальнейшего использования.
Вот правильный вариант:
...
Код

use Time::HiRes; 
my ($s,$mks)=(0,0);
my $result = eval{($s,$mks)=Time::HiRes::gettimeofday();};
print "<br>$s--$mks";
#
#  вычисляем блок (например, поиск в БД)
#
$result = eval{($s,$mks)=Time::HiRes::gettimeofday();};
print "<br>$s--$mks";

...

Совершенно непонятно, зачем нужны strict, warnings, diagnostics и даже eval, если почти всегда идет ошибка 500.
Как выводить все ошибки в браузер???
PM MAIL   Вверх
JackYF
Дата 16.2.2010, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: нет
Всего: 162




M
JackYF
vechik, пользуйся кнопкой "Код".



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
mvsgt
Дата 16.2.2010, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 27.3.2009

Репутация: 1
Всего: 1



vechik, надо хотя бы чуть-чуть перл подучить, а? 

Ну зачем Вы используете $result = eval{($s,$mks)=Time::HiRes::gettimeofday();}; ? Time::HiRes используется для вычисления точного времени, а eval замедляет его получение.
зачем strict - затем, чтобы в браузер шла ошибка 500, без strict ошибок будет меньше, но программа может начать работать неправильно.
Функцию можно писать с префиксами, можно без. В документации всё описано. Но с префиксами может и лучше.

Чтобы видеть ошибки, запускайте свои скрипты без браузера. 
Зачем Вы в браузер суёте неотлаженные скрипты? Во всяком случае в error_log должны быть сообщения об ошибках, которые не видны в браузере. Если компиляция скрипта не проходит, то fatalsToBrowser не проходит. Кстати, этот тэг есть в CGI.

PM MAIL   Вверх
RomanCh
Дата 16.2.2010, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 23.8.2009

Репутация: нет
Всего: нет



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

use Time::HiRes qw/gettimeofday tv_interval/;

my $tStart = [gettimeofday];
sleep 1; # например ждём секунду

print "Elapsed " . tv_interval ( $tStart ) . "\n";

В cgi окружение надеюсь автор сам сможет впихнуть smile

Добавлено через 2 минуты и 42 секунды
PS топикстартер, попробуйте использовать команду man Time::HiRes или хотя бы посмотрите тут.
PM MAIL WWW Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0485 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.