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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с SSI :( 
:(
    Опции темы
korob2001
Дата 31.3.2004, 03:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Привет!
Есть два фала CGI.
Файл /cgi-bin/mycount/count.pl выглядит так:
Код

#!/usr/bin/perl -w
use strict;
use warnings;
use Fcntl qw| :flock |;
my $counter   = shift( @ARGV );
my $silent    = 0;
my $link      = 1;
my $link_URL  = 'http://perl.org/';
my $SEMAPHORE = $counter . '.lck';
my $visits;
print "Content-type: text/html\n\n";
open ( S, ">> $SEMAPHORE" ) or die "Не могу открыть файл семафора ( $SEMAPHORE ): $!";
flock( S, LOCK_EX ) or die "Не могу заблокировать файл: $!";

if ( -e $counter ) {
    open( FILE, "< $counter" ) or die "Не могу открыть файл ( $counter ): $!";
    my $visits = <FILE>;
    close( FILE ) or die "Не могу закрыть файл ( $counter ): $!";
}

open ( FILE, "> $counter" ) or die "Не могу открыть файл ( $counter ): $!";
print FILE ++$visits;
close( FILE ) or die "Не могу закрыть файл ( $counter ): $!";
close( S ) or die "Не могу закрыть файл блокировки ( $SEMAPHORE ): $!";

if (! $silent ) {
   if ( $link ) {
      print qq(<H3>Вы посетитель номер <A HREF="$link_URL">$visits</A></H3>!);
   } else {
      print qq(<H3>Вы посетитель номер $visits!</H3>);
   }
}


Файл /cgi-bin/time.pl выглядит так
Код

#!/usr/bin/perl -w
use strict;
print "Content-type: text/html\n\n";
my $time = localtime( time );
print "<h3>Текущее время: <font color='#aa0000'>$time</font></h3>";


И есть файл tm.html который выглядит так:
Код

<HTML>
<HEAD>
<TITLE>Тест 1 счётчика посещений</TITLE>
</HEAD>
<BODY>
<!--#include virtual='/cgi-bin/mycount/count.pl file_data.dat'--><BR>
<!--#include virtual='/cgi-bin/time.pl'--><BR>
</BODY>
</HTML>


Проблема в том, что не выводится значение счётчика. Вместо него я получаю строку:
[an error occurred while processing this directive]
Но в тоже время у меня отображается текущее время из файла /cgi-bin/time.pl

В чём может быть проблема? sad.gif


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
GoodBoy
Дата 31.3.2004, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

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



замени это:
Код
<!--#include virtual='/cgi-bin/mycount/count.pl file_data.dat'-->

на это:
Код
<!--#include virtual='/cgi-bin/mycount/count.pl?file_data.dat'-->


и это:
Код
my $counter   = shift( @ARGV );

на это:
Код
my $counter   = $ENV{QUERY_STRING};

и все будет хорошо!!! :-)))))))))


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
korob2001
Дата 31.3.2004, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



и все будет хорошо!!! :-)))))))))
Да это я знаю ;)
Просто читаю книгу 'Разработка CGI-приложений на Perl' авторы Кевин Мельтцер и Брент Михальски. Так этот код, точная копия того, что в книге.
Мне просто интересно почему он не работает. Кстати второй пример, только уже графического счётчика, тоже не работает. В нём тоже параметры передаются как в командной строке, через @ARGV.
Если у кого-то есть эта книга, то можно посмотреть стр.107, а графический счётчик стр.111. Проблема с этими двумя скриптами.

Так же написано, что пример который указан выше нужно вызывать через SSI, таким образом:
Код
<!--#include virtual='/cgi-bin/mycount/count.pl file_data.dat'-->

А пример графического счётчика, нужно вызывать так:
Код
<!--#exec cmd="../cgi-bin/count2.pl img_counter.dat myStyle"-->


А вот пример графического счётчика:
Код

#!/usr/bin/perl -w
use strict;
use warnings;
use Fcntl qw| :flock |;
use Image::Size qw| html_imgsize |;
my $counter = $ARGV[0];
my $style = $ARGV[1];
my $SEMAPHORE = $counter . '.lck';
my $visits = 0;
open(S, ">> $SEMAPHORE") || die "Не могу открыть файл блокировки ( $SEMAPHORE ): $!";
flock(S, LOCK_EX) or die "Не могу заблокировать файл: $!";
if ( -e $counter ) {
    open( FILE, "< $counter" ) or die "Не могу прочитать счётчик ( $counter ): $!";
       $visits = <FILE>;
    close( FILE ) or die "Не могу закрыть файл ( $counter ): $!";
}

open( FILE, "> $counter" ) or die "Не могу открыть файл ( $counter ): $!";
print FILE ++$visits;
close( FILE ) or die "Не могу закрыть файл ( $counter ): $!";

close( S ) or die "Не могу закрыть файл блокировки ( $SEMAPHORE ): $!";

exit unless -d $style;
my @digits = split(//, $visits);
foreach ( @digits ) {
  my $size = html_imgsize("$style/$_.gif");
  print qq(<img src="$style/$_.gif">);
}


Это сообщение отредактировал(а) korob2001 - 31.3.2004, 15:19


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
GoodBoy
Дата 1.4.2004, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

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



2 korob2001 Формат вызова
Код
count.pl file_data.dat
используется при работе с командной строкой. В формате же SSI включения <!--#include virtual='...'--> используется синтаксис GET-запроса и, поэтому, ни о каких аргументах командной строки не может быть и речи!!

Другое дело
Код
<!--#exec cmd="../cgi-bin/count2.pl img_counter.dat myStyle"-->
Вот, что пишут об этой команде:
Цитата
'exec'
Выполнене внешних программ и программ CGI Script.

Парамеры:

'cmd' - задане командной строки параметров для выполнения UNIX shell исполняемых программ. Формат командной строки: cmd="<exename> <argument list>"

где: <exename> полное имя исполняемой программы или команды, и <argument list> список аргументов, посылаемых исполняемой программе в командной строке.

Замечание:
на сервере должны быть заданы пути к исполняемой программе в переменной окружения 'PATH'.
В случае отсутвия пути программу можно запустить, используя shell или CGI Script. Стандартный вывод программы направляется в HTML документ. Вывод может быть модифицирован командой
'config cmdecho'

'cgi' - вызов программы CGI Script. Вызываемая программа должна находится в директории CGI-BIN WWW сервера или иметь префикс, например, .cgi, который задан для Shell программ в конфигурационном файле сервера. Формат команды: cgi="<exename>"

где <exename> полное имя программы CGI Script.
Стандартный вывод программы подставляется в документ.


Лично я предпочитаю использовать SSI-вызовы в таком формате:
Код
<!--#include virtual="/cgi-bin/count2.pl?file=img_counter.dat&style=myStyle" -->
А в программе сделать обычный разбор запроса... :-))))


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
korob2001
Дата 1.4.2004, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



To GoodBoy
Спасибо, всё понятно. Это наверное переводчики лоханулись. Но дело в том, что если вызывать так:
<!--#exec cmd="../cgi-bin/count2.pl img_counter.dat myStyle"-->
то в HTML'ник вообще ничего не выводится. sad.gif При просмотре HTML кода, на том, месте где был вызов программы CGI через SSI, остаётся лишь пустое место.

Сейчас попробую ещё поэксперементировать. Если чего-то добъюсь, напишу.

Это сообщение отредактировал(а) korob2001 - 1.4.2004, 11:29


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
korob2001
Дата 1.4.2004, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Пробую вызвать так:
<!--#exec cmd="perl D:/cgi-bin/mycount/count.pl D:/cgi-bin/mycount/text_counter.dat" -->

Получаю:

Вы посетитель номер 1
!

После перезагрузки страницы счетчик не увеличивается, так на единице и остаётся.sad.gif

Это сообщение отредактировал(а) korob2001 - 1.4.2004, 11:50


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


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

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


 




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


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

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