Pike 脚本非常像 Perl 脚本。当用户尝试访问它时,它会被执行。因此,Pike 脚本通常是你公共 Web 文件所在的位置。如果你已经有 Perl 背景并想尝试 Pike,这是一个不错的选择。
在这样做时,你有两种选择。你可以将 Pike 作为 CGI 脚本执行,或者在服务器内部执行。如果你不知道什么是 CGI,请在 http://www.tldp.org/ 查看 Apache-Overview-HOWTO。
在这里,我们将在 Caudium 内部运行 Pike 脚本。要实现这一点,你必须通过选择在你的服务器中加载另一个模块加载模块在 CIF 中。现在你有了 Caudium 中所有可用模块的列表。正如你所看到的,有很多模块,阅读此页面应该会给你一些未来开发的想法。要选择 Pike 脚本模块,只需单击名为 “Pike script support” 的图像(如果你使用图形浏览器)。
现在你可以创建一个包含例如以下内容的 .pike 文件,
示例 6-3. 一个基本的 Pike 脚本。
// you have to inherit caudiumlib to have some basic things // like the id object and response mapping inherit "caudiumlib"; // the same as the main // if you modify this script and you see that Caudium don't take your // modification into account, reload the Pike script support module // This is because Caudium uses a cache for performance reasons string parse(object id) { string html = "<html><body>The id object contain some " "very useful information<br />"; html += sprintf("The id->variables contain a list of " "arguments given to this script %O\n", id->variables); return html; } |
Pike 脚本通常用于小型内部开发。在这种情况下,Pike 脚本非常有用,因为你可以用很少的行创建一些东西。这是一个此类脚本的示例
示例 6-4. 一个真实世界的脚本。
/* Here is a Pike script (not a Caudium module). This script is less than 20 lines (comments and blank lines excluded) and will randomly return one file to the web browser from a list of files. This script was kindly provided by Xavier Beaudouin */ // first we need to inherit from caudiumlib in order to get // the parse, http_redirect functions and id object // recognized. inherit "caudiumlib"; // we declare an array of files array (string)files; // an ASCII text containing the name of a file // on the real filesystem. // Each file name in this file will be // randomly return (the files name have to be on // a separate line). #define FILELIST "/list" #define BASEDIR "/thepath2yourfiles/" // this function is the constructor, it will be loaded first void create () { // the array of strings 'files' will contain // all the files we serve provided the file // FILELIST list each file name on one line. files = Stdio.read_bytes(FILELIST)/"\n"; } // if no_reload return 1, Caudium will cache the // result of this script for maximum performances // and will not execute it a second time. // As a result, If you give the argument // ?reload=1 to your script, Caudium will // reload it. // This is useful to use cache for average // content delivery unless you are doing // developpement int no_reload(object id) { if(!id->variables->reload) return 1; return 0; } // As this is a simple pike script (CGI like), this function // will be called by Caudium and should return a string that // will be display to the client's browser. // It can also return a mapping containing all the HTTP response // (headers + text) mapping parse(object id) { // We randomly return one of the file we list in the FILELIST file // (relative to BASEDIR directory). // http_redirect will send a HTTP 301 header telling the browser // where to get randomly selected file. return http_redirect(BASEDIR + files[random(sizeof(files))],id); } |
示例 6-5. 一个为高级用户准备的脚本。
inherit "caudiumlib"; string|mapping|object parse( object id ) { id->my_fd->write(id->clientprot + " 200 Ok\r\n"); id->my_fd->write("Server: Caudium !\r\n"); id->my_fd->write("Expires: 0\r\n"); id->my_fd->write("Content-Type: text/html\r\n"); id->my_fd->write("pragma: no-cache\r\n\r\n"); id->my_fd->set_id( ({ id->my_fd }) ); id->my_fd->set_nonblocking(0,send_data); return http_pipe_in_progress(); } void send_data(array (object) id) { id[0]->write("<pre>"); id[0]->write("test......................\n"); id[0]->write("test......................\n"); id[0]->write("test......................\n"); id[0]->write("sleep for 10 sec\n"); sleep(10); id[0]->write("Done</pre>"); id[0]->close(); destruct(id[0]); } |
但是,尽管 Pike 脚本允许你编写一些复杂的代码,但它不太适合大型项目。如果是这种情况,请阅读下一段并享受。
![]() | Caudium API 在 http://caudium.net/ 上可用。你还应该阅读 http://caudium.info/ 上的 Roxen 1.3 PDF。Pike 脚本是阻塞的,并允许你的用户以与服务器相同的权限运行脚本。阻塞意味着如果来自 pike 脚本的套接字被停滞(通常是等待某些东西),服务器将被停滞。即使你在脚本中使用非阻塞套接字,这也适用。使用模块你不会遇到这个问题。 |