Did you know ... | Search Documentation: |
http_cgi.pl -- Run CGI scripts from the SWI-Prolog web-server |
The Prolog HTTP server is primarily designed to be able to handle HTTP requests from a running Prolog process, which avoids the Prolog startup time and, at least as interesting, allows you to keep state in the Prolog database. It is not designed to run as a generic web server. There are tools that are much better for that job. Nevertheless, it is useful to host a complete server in one process, mainly to simplify deployment. For this reason, the SWI-Prolog HTTP server provides libraries to serve static files (http_reply_file/3, http_reply_from_files/3) and this library, which allows executing CGI scripts.
A sensible alternative setup for a mixed server is to use a normal server such as Apache as main server, serving files, CGI scripts, modules, etc., and use Apache's proxy facilities to host a subdirectory of the server using a Prolog server. That approach is most likely more efficient for production environments, but harder to setup for development purposes.
This module provides two interfaces:
myscript.php
from the location =/myscript/=.
Note that this requires the commandline version of PHP to be
installed as php
in the current PATH
.
:- http_handler(root(myscript), http_run_cgi(path(php), [argv('myscript.php')]), []).
cgi_bin
for absolute_file_name/3. If this path is
present, calls to /cgi-bin/... are translated into calling the script.
For example, if programs in the directory cgi-bin
must be accessible
as CGI services, add a rule
:- multifile user:file_search_path/2. user:file_search_path(cgi_bin, 'cgi-bin').
path_info
in Request and execute the script using
http_run_cgi/3. This library installs one handler using:
:- http_handler(root('cgi-bin'), http_run_cgi(cgi_bin, []), [prefix, spawn([])]).
Transfer-encoding
headertransfer_encoding(chunked)
.