file Alt ←

Конструкторы ::cgi и ::exec

Исполнение программы.

^file::cgi[имя_файла]
^file::cgi[имя_файла;env_hash]
^file::cgi[имя_файла;env_hash;аргумент1;аргумент2;…]
^file::cgi[формат;имя_файла;env_hash;аргумент1;аргумент2;…]
^file::exec[имя_файла]
^file::exec[имя_файла;env_hash]
^file::exec[имя_файла;env_hash;аргумент1;аргумент2;…]
^file::exec[формат;имя_файла;env_hash;аргумент1;аргумент2;…]

Конструктор cgi создает объект класса file, содержащий результат исполнения программы в соответствии со стандартом CGI.

Все пути в Parser указываются относительно текущего исполняемого файла. По аналогии, при запуске внешнего скрипта текущим каталогом для него является каталог, где находится этот скрипт.

Заголовки, которые выдаст CGI-скрипт, конструктор поместит в поля класса file в ВЕРХНЕМ регистре. Например, если некий скрипт script.pl среди прочего выдает в заголовке строку field:value, то после работы конструктора $f[^file::cgi[script.pl]], обратившись к $f.FIELD, получим значение value.

Конструктор ::exec

Аналогичен ::cgi, но не отделяет HTTP-заголовки от текста, возвращаемого скриптом.

Формат — формат представления получаемых от скрипта данных. Может быть text (по умолчанию) или binary. При использовании формата binary не будут производиться перекодирования полученных данных в кодировку $request:charset и их обрезания по первому нулевому символу.

Имя файла — имя файла с путем.

Аргумент — строка или массив строк [3.5.0] или таблица с одним столбцом, содержащая аргументы.

Объект, созданный конструкторами cgi и exec, имеет дополнительные поля:

status — информация о статусе завершения программы (обычно 0 означает, что программа завершилась успешно, не 0 — с ошибкой);
stderr — результат считывания стандартного потока ошибок.

Пример

$cgi_file[^file::cgi[new.cgi]]
$cgi_file.text

Выведет на экран результаты работы скрипта new.cgi.

Необязательные параметры конструкторов:
env_hash — хеш, в котором могут задаваться:

  • дополнительные переменные окружения, которые впоследствии будут доступны внутри исполняемого скрипта;
  • ключ stdin, который содержит текст, передаваемый исполняемому скрипту в стандартном потоке ввода;
  • ключ charset, задающий кодировку, в которой работает скрипт (будут перекодированы данные, передаваемые скрипту и получаемые из скрипта).
Можно задавать только стандартные CGI-переменные окружения и переменные, имена которых начинаются с CGI или HTTP (допустимы латинские буквы в ВЕРХНЕМ регистре, цифры, подчеркивание, минус).

В версиях с отключенным safe-mode переменным окружения можно задавать любые имена. [3.4.1]

При обработке HTTP POST-запроса, при помощи конструкции $.stdin[$request:body] можно передать в стандартный поток ввода скрипта полученные POST-данные.

Запускаемому скрипту также передаются все переменные окружения, которые были выставлены HTTP-сервером при запуске Parser.

Пример исполнения внешнего CGI-скрипта

$search[^file::cgi[search.cgi;
	$.QUERY_STRING[text=$form:q&page=$form:p]
]]

Пример исполнения внешнего скрипта

$script[^file::exec[script.pl;
	$.CGI_INFORMATION[этого мне не хватало]
]]

Внутри скрипта script.pl можно воспользоваться переданной информацией:

print "Дополнительная информация: $ENV{CGI_INFORMATION}\n";

Пример получения бинарных данных от внешнего скрипта

$response:body[^file::exec[binary;getfile.pl;
	$.CGI_FILENAME[$form:filename]
]]

Пример передачи нескольких аргументов

Кроме того, вызываемой программе можно передать ряд аргументов, перечислив их через точку с запятой после хеша переменных окружения:

$script[^file::exec[script.pl;;длина;ширина]]

или передать методу список аргументов, заданный в виде таблицы с одним столбцом:

$args[^table::create{arg
длина
ширина}]

$script[^file::exec[script.pl;;$args]]

Пример скрипта для исполнения процесса в фоновом режиме

При необходимости исполнения длительного процесса его можно запустить в фоновом режиме с помощью промежуточного скрипта. При этом, чтобы скрипт завершился сразу, необходимо перенаправить stdout и stderr процесса:

#/bin/sh
sleep 60 >/dev/null 2>&1 &
Настоятельно рекомендуется хранить запускаемые скрипты вне веб-пространства, поскольку запуск скрипта с произвольными параметрами может привести к неожиданным результатам.