Где CGI.pm обычно создает временные файлы?

На всех моих серверах Windows, за исключением одного компьютера, когда я выполняю следующий код для выделения папки временных файлов:

use CGI;
my $tmpfile = new CGITempFile(1);
print "tmpfile='", $tmpfile->as_string(), "'\n";

Переменной $tmpfile присвоено значение '.\CGItemp1', и это то, что я хочу. Но на одном из моих серверов он неправильно настроен на C:\temp\CGItemp1.

Все серверы работают под управлением Windows 2003 Standard Edition, IIS6 и ActivePerl 5.8.8.822 (обновление до более поздней версии Perl невозможно). Результат всегда один и тот же при запуске сценария из командной строки или в IIS в качестве сценария CGI (где карта сценариев .pl = c:\perl\bin\perl.exe "%s" %s).

Как я могу исправить эту установку Perl и заставить ее возвращать .\CGItemp1 по умолчанию?

Я даже скопировал всю папку Perl с одного из рабочих серверов на эту машину, но без радости.

@Hometoast:

Я проверил переменные среды «TMP» и «TEMP», а также $ENV{TMP} и $ENV{TEMP}, и они идентичны.

Из командной строки они указывают на каталог профиля пользователя, например:

C:\DOCUME~1\[USERNAME]\LOCALS~1\Temp

При запуске под IIS в качестве сценария CGI они оба указывают на:

c:\windows\temp

В ключе реестра HKEY_USERS/.DEFAULT/Environment на обоих серверах есть:

%USERPROFILE%\Local Settings\Temp

Реализация CGITempFile() ActiveState явно использует альтернативный механизм для определения того, как следует создавать временную папку.

@Ranguard:

Настоящая проблема связана с модулем CGI.pm и обращением с насадками. Всякий раз, когда файл загружается на сайт, CGI.pm необходимо временно сохранить его. Для этого в CGITempFile() вызывается CGI.pm для выделения временной папки. К сожалению, я не могу использовать File::Temp. Спасибо, в любом случае.

@Крис:

Это очень помогло. Раньше у меня было быстрое сканирование источника CGI.pm, но ваше предложение заставило меня вернуться и более внимательно изучить его, чтобы понять лежащий в основе алгоритм. У меня все заработало, но самое странное, что изначально на сервере не было папки c:\temp.

Чтобы получить временное исправление, я создал папку c:\temp и установил соответствующие разрешения для анонимной учетной записи пользователя веб-сайта. Но поскольку это общий ящик, я не мог оставить все так, даже если временные файлы удалялись. Короче говоря, я переименовал папку c:\temp во что-то другое, и волшебным образом возвращался правильный путь к папке .\. Я также заметил, что клиент включил на сайте расширения FrontPage, которые закрывают доступ на запись для анонимной учетной записи пользователя в папках веб-сайта, поэтому это разрешение потребовалось повторно применить. Я все еще не понимаю, почему в начале этой проблемы CGITempFile() возвращал c:\temp, хотя этой папки не существовало, и почему он снова начал работать волшебным образом.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
4 155
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если вы запускаете этот сценарий от имени себя, проверьте переменную среды% TEMP%, чтобы узнать, не отличается ли она.

Если IIS выполняется, проверьте значения в реестре для TMP и TEMP в разделе HKEY_USERS / .DEFAULT / Среда

Ответ принят как подходящий

Имя временного каталога хранится в $CGITempFile::TMPDIRECTORY и инициализируется функцией find_tempdir в CGI.pm. Алгоритм выбора временного каталога описан в документации CGI.pm (поиск -private_tempfiles). IIUC, если на сервере существует папка C: \ Temp, CGI.pm будет использовать ее. Если ни один из каталогов, проверенных в find_tempdir, не существует, то текущий каталог "." используется.

Надеюсь, это поможет.

Не прямой ответ на ваш вопрос, но пробовали ли вы использовать File :: Temp?

Он специально разработан для работы с любой ОС.

Другие вопросы по теме