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

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

Конструктор
cgi создает объект класса file, содержащий результат исполнения программы в соответствии со стандартом CGI.
Внимание: все пути в парсере указываются относительно текущего исполняемого файла.
По аналогии, при запуске внешнего скрипта текущим каталогом для него является каталог, где находится этот скрипт.


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

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

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

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

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

Пример:
$cgi_file[^file::cgi[new.cgi]]
$cgi_file.text


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

Необязательные параметры конструкторов:

env_hash - хеш, в котором могут задаваться
·дополнительные переменные окружения, которые впоследствии будут доступны внутри исполняемого скрипта;  
·ключ stdin, содержащая текст, передаваемый исполняемому скрипту в стандартном потоке ввода;  
·ключ charset, задающий кодировку, в которой работает скрипт (будут перекодированы данные передаваемые скрипту и получаемые из скрипта). [3.1.3]  
Внимание: можно задавать только стандартные CGI переменные окружения и переменные, имена которых начинаются с CGI_ или HTTP_ (допустимы латинские буквы в ВЕРХНЕМ регистре, цифры, подчеркивание, минус).
Внимание: в unsafe-mode версиях у переменных окружения можно задавать любые имена. [3.4.1]
Внимание: при обработке
HTTP POST запроса, при помощи конструкции $.stdin[$request:body] вы можете передать в стандартный поток ввода скрипта полученные вами POST-данные. [3.0.8, раньше они передавались по-умолчанию]
Внимание: запускаемому скрипту также передаются все переменные окружения, которые были выставленные 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;;длина;ширина]]

...или передать методу список аргументов, заданный в виде таблицы с одним столбцом:
   [3.2.2]
$args[^table::create{arg
длина
ширина}]
$script[^file::exec[script.pl;;$args]]



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

При необходимости исполнения длительного процесса его можно запустить в фоновом режиме с помощью промежуточного скрипта.
При этом чтобы скрипт завершился сразу, необходимо перенаправить stdout и stderr процесса:
#/bin/sh
sleep 60 >/dev/null 2>&1 &


Внимание: настоятельно рекомендуется хранить запускаемые скрипты вне веб-пространства, поскольку запуск скрипта с произвольными параметрами может привести к неожиданным результатам.


In order to add comments you must register.
Copyright © 1997–2021 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 04.05.2016