Работает ли оператор проверки файлов -f в mod_perl? - PullRequest
1 голос
/ 01 октября 2009

Я пытаюсь использовать модуль Tenjin, но он не работает, потому что он не может найти файл шаблона, но он существует. Я добавил несколько отладочных операторов в модуль, и он не передает

return $filepath if (-f $filepath);

, даже если $ filepath указан правильно. Я пробовал в автономном скрипте, и он отлично работает, но когда я копирую его в скрипт mod_perl, это не удается. Есть идеи?

$ filepath - это полный абсолютный путь: /something/another/dir/2/filename.plhtml

Это функция из модуля. Обратите внимание на мой «Debug» ... он печатает правильный путь к файлу 777, но никогда не печатает YES.

sub find_template_file {
my ($this, $filename) = @_;

my $path = $this->{path};
if ($path) {
    my $sep = $^O eq 'MSWin32' ? '\\\\' : '/';
    foreach my $dirname (@$path) {
        my $filepath = $dirname . $sep . $filename;
        print STDERR "--$filepath--\n";
        if (-f $filepath){
            print STDERR "--- YES ---\n\n";
        }
        return $filepath if (-f $filepath);
    }
} else {
    return $filename if (-f $filename);
}
my $s = $path ? ("['" . join("','", @$path) . "']") : '[]';
die "Tenjin::Engine: $filename not found (path=$s).";

}

Сбой с

Tenjin :: Engine: index.plhtml не найден (путь = ['/ var / 2.0 / templates / search']). в /usr/lib/perl5/site_perl/5.8.8/Tenjin/Engine.pm строка 56. \ n

Ответы [ 5 ]

5 голосов
/ 01 октября 2009

Для процесса Apache также требуется чтение и выполнение доступа в каждом подкаталоге вплоть до полного пути. (Если задействованы символические ссылки, будет сложнее определить, каков доступ).

Если вы можете отладить сценарий, установленный на веб-сервере, вы можете попросить Perl выдать вам сообщение об ошибке:

if (! -f $filename) {
    open(ACK, "<", $filename);
    print STDERR "Couldn't open $filename because of: $!\n";
}
2 голосов
/ 01 октября 2009

-f вернет false, если файл не существует, но undef, если вызов stat не выполнен по какой-либо другой причине.

Проверьте, определен ли возврат, а если нет, покажите ошибку, которая будет установлена ​​в $ !. Это может дать вам подсказку.

1 голос
/ 01 октября 2009

Укажите -f полный путь к файлу и убедитесь, что он доступен для чтения Apache.

0 голосов
/ 01 октября 2009

Я собираюсь полностью игнорировать то, что вы спросили, и вместо этого ответить на что-то совершенно другое! Я просто сумасшедший!

Ну, не совсем, я использую основной модуль Perl, File :: Find , вместо того, чтобы писать свой собственный анализатор каталогов.

По запросу, вот вопрос, на который я действительно отвечаю: «Как найти путь к файлу, который находится где-то в подкаталоге определенного набора путей?»

use File::Find;

# Other parts of the class here

sub find_template_file {
    my ($this, $filename) = @_;

    my $file_path;

    my $path = $this->{path};

    # Note that this inner sub uses variables we defined above
    find(sub {
        if ($_ eq $filename)
            $file_path = $File::Find::name;
    }, @$path);

    if ($file_path)
        return $file_path;

    my $s = $path ? ("['" . join("','", @$path) . "']") : '[]';
    die "Tenjin::Engine: $filename not found (path=$s).";
}
0 голосов
/ 01 октября 2009

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

...