亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Perl > 正文

Perl使用nginx FastCGI環境做WEB開發實例

2020-10-31 15:16:37
字體:
來源:轉載
供稿:網友

Hello World

一個簡單的hello world例子:

復制代碼 代碼如下:

#!/usr/bin/env perl
use strict;
use warnings;
use CGI::Fast;
while(my $q = new CGI::Fast)
{
 print $q->header("text/plain");
 print "Hello World";
}

和CGI的區別僅在于多了一個循環來接受請求,CGI::Fast對象和CGI接口是一樣的,而且該腳本也可以當做CGI腳本使用。

搭建nginx + FastCGI 環境

Perl使用CGI::Fast包來提供FastCGI服務,該包提供兩種方式來啟動FastCGI進程,一個是直接使用該包提供的服務將當前進程變為FastCGI進程,另外一個是使用第三方工具spawn-fcgi來啟動。
nginx配置方式例子:

復制代碼 代碼如下:

        location / {
            fastcgi_pass   127.0.0.1:8184;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi_params;
        }

配置好nginx后,使用spawn-fcgi來啟動前面的Hello World:
復制代碼 代碼如下:

$ spawn-fcgi -n -a 127.0.0.1 -p 8184 -f ./main.pl


調試支持

在前面的命令行里使用了參數-n,讓spawn-fcgi不要fork出多個進程,并阻塞,允許用戶Ctrl+C來關閉,產品服務器可以去掉這個參數來充分利用服務器的多核來提供更高的并發數。我之前寫了一個bash腳本,允許在文件改動的情況下重啟服務,方便調試perl程序,代碼如下:

復制代碼 代碼如下:

#!/bin/bash
#PID文件和需要啟動的腳本
PID_FILE=service.pid
MAIN=main.pl

#關閉之前啟動的進程
term() {
    test -e $PID_FILE || return
    pid=`cat $PID_FILE`
    kill -s -0 $pid  || return
    echo "Terminating $MAIN $pid"
    rm -f $PID_FILE
    kill $pid
    wait $pid
}
#當前腳本退出的時候也關閉啟動了的FastCGI進程
trap "term;exit" SIGINT SIGTERM
while true
do
#首次啟動或者文件改動后都需要關閉之前的進程
    term
#以no fork方式啟動腳本來調試,并將PID寫入到文件
    spawn-fcgi -n -a 127.0.0.1 -p 8184 -f ./$MAIN  &
    pid=$!
    echo $pid > $PID_FILE
    echo "My Perl service started, pid = $pid"
#監控文件變化
    files=`find . -name '*.pl' -o -name '*.pm' -o -name '*.html'`
    md5=`md5sum $files|md5sum`
#wait for file change
    while [[ `md5sum $files|md5sum` = "$md5" ]]
    do
        sleep 1
    done
    echo "File changes detected, restarting service"
done


該腳本已在Mac OSX和Linux下測試通過

路由系統

做Web開發離不開路由實現,來對不同請求來做出特定的響應。
路由請求依賴HTTP Method和URI兩部分,因此主要就是需要這兩者來做分派。
在CGI中可以通過環境變量REQUEST_METHOD和REQUEST_URI來獲取請求方法和URI。
因此一個簡單的路由系統實際上可以分解為一個二級的map,注冊路由實際上就是往這個map里放入規則對應的處理函數,而分派請求則是從這個map里根據規則獲取對應的處理函數,一個簡單的例子:

復制代碼 代碼如下:

my %routers = ();

sub not_found
{
    print "Status: 404/n";
    print "Content-Type: text/html/n/n";
    print<<EOF
<html>
<body>
<h1>404 Not found</h1>
Cannot find $ENV{REQUEST_PATH}.
</body>
</html>
EOF
}


sub add_rule
{
    my ($method, $path, $callback) = @_;
    my $handlers = $routers{$method};
    $handlers = $routers{$method} = {} if not $handlers;
    $handlers->{$path} = $callback;
}

sub dispatch
{
    my $q = shift;
    my $method = $ENV{REQUEST_METHOD};
    my $uri = $ENV{REQUEST_URI};
    $uri =~ s//?.*$//;
    my $handler = ($routers{$method} || {})->{$uri} || not_found;
    eval
    {
 &$handler($q);
    };
    print STDERR "Failed to handle $method $uri: $@/n" if $@;
}


使用這個路由系統的例子:
復制代碼 代碼如下:

sub index
{
    my ($q) = @_;
    print $q->header('text/plain');
    print "Hello World!";
}

router::add_rule('GET', '/', /&index);


模板系統

perl提供了大量的模板系統的實現,我個人最喜歡的是Template Toolkit,文檔也非常豐富,網站是 http://www.template-toolkit.org/ 。

將前面的index修改為使用模板的例子:

復制代碼 代碼如下:

use Template;

my $tt = new Template({INCLUDE_PATH => 'templates', INTERPOLATE => 1});

sub index
{
    my ($q) = @_;
    my $output = '';
    print $q->header('text/html');

    $tt->process('index.html', {world => 'World'}, $output) || die $tt->error();
    print $output;
}


其中templates/index.html文件內容如下:
復制代碼 代碼如下:

<html>
<head><title>Demo</title></head>
<body>
Hello ${world}
</body>
</html>

完!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品永久在线| 久久久久久有精品国产| 欧美色视频日本高清在线观看| 5278欧美一区二区三区| 国产一区二区三区在线观看视频| 国产欧美一区二区| 亚洲精品视频播放| 91在线精品视频| 91精品国产高清久久久久久| 欧美猛交免费看| 国产美女久久精品香蕉69| 国内精品久久久久久| 久久久久久久影院| 久久躁狠狠躁夜夜爽| 亚洲最大在线视频| 91国内产香蕉| 热99久久精品| 国产一区二区三区在线观看视频| 最新国产精品拍自在线播放| 色www亚洲国产张柏芝| 97视频com| 国产99视频精品免视看7| 91午夜在线播放| 日韩精品免费电影| 久久夜精品va视频免费观看| 亚洲精品福利在线观看| 亚洲缚视频在线观看| 亚洲国产成人精品女人久久久| 欧美亚洲成人精品| 国产a∨精品一区二区三区不卡| 久久久亚洲成人| 亚洲欧洲偷拍精品| 精品久久久久人成| 国内精品模特av私拍在线观看| 日韩免费在线电影| 亚洲精品国产综合区久久久久久久| 亚洲综合一区二区不卡| 久久久久久久av| 国产一区二区三区三区在线观看| 狠狠久久五月精品中文字幕| 日韩精品免费一线在线观看| 免费成人高清视频| 亚洲裸体xxxx| 欧美激情成人在线视频| 欧美日韩在线视频一区二区| 欧美—级高清免费播放| 国产91精品高潮白浆喷水| 日韩成人激情影院| 91黄色8090| 欧美裸体男粗大视频在线观看| 日韩成人中文字幕在线观看| 欧美激情亚洲一区| 一本色道久久综合亚洲精品小说| 992tv成人免费视频| 国产成人av在线播放| 欧美性色19p| 久久久久久亚洲| 精品久久久久久久久久| 久久久久久久国产精品视频| 久久理论片午夜琪琪电影网| 国产精品久久中文| 欧美精品18videosex性欧美| 精品偷拍一区二区三区在线看| 夜夜躁日日躁狠狠久久88av| 国产日韩欧美日韩大片| 亚洲精品v欧美精品v日韩精品| 综合av色偷偷网| 91欧美视频网站| 欧美日韩免费区域视频在线观看| 97精品国产97久久久久久免费| 日韩在线观看免费网站| 久久久久久综合网天天| 亚洲人成电影在线| 综合av色偷偷网| 黑人巨大精品欧美一区二区三区| 国产视频丨精品|在线观看| 一个人看的www久久| 久久综合国产精品台湾中文娱乐网| 日产精品久久久一区二区福利| 欧美专区国产专区| 久久精品一本久久99精品| 国产亚洲精品日韩| 米奇精品一区二区三区在线观看| 亚洲国产高清自拍| 高跟丝袜欧美一区| 久久亚洲国产精品| 亚洲欧美日韩久久久久久| 久久久久成人网| 九九九热精品免费视频观看网站| 国产美女久久久| 成人午夜在线视频一区| 在线成人中文字幕| 亚洲精品一区中文| 97欧美精品一区二区三区| 国产精品久久二区| 日韩电影中文字幕一区| 日韩精品在线观看网站| 亚洲免费人成在线视频观看| 日韩av在线影视| 欧洲亚洲女同hd| 日韩最新在线视频| 国产成人亚洲综合| 日韩高清电影好看的电视剧电影| 国产精品成av人在线视午夜片| 日本高清视频一区| 国产成人久久精品| 国产亚洲精品美女久久久久| 亚洲精品理论电影| 欧美日韩第一页| 成人免费黄色网| 亚洲成人在线视频播放| 日本sm极度另类视频| 国产99久久精品一区二区 夜夜躁日日躁| 日韩经典一区二区三区| 亚洲精品国产精品自产a区红杏吧| 国产精品三级美女白浆呻吟| 日韩在线观看免费高清| 一道本无吗dⅴd在线播放一区| 日韩精品中文字幕在线观看| 91av在线看| 日韩av网站电影| 免费av一区二区| 国产视频观看一区| 一区二区三区四区在线观看视频| 国产精品美女久久| www.xxxx欧美| 中文字幕日韩欧美在线视频| 成人国产在线视频| 57pao国产成人免费| 亚洲成人网久久久| 亚洲欧美国产精品久久久久久久| 亚洲xxxxx性| 亚洲999一在线观看www| 亚洲黄色www| 欧美在线一区二区视频| 色中色综合影院手机版在线观看| 久久91超碰青草是什么| 国产亚洲精品美女久久久| 国产精品一区二区av影院萌芽| 亚洲欧美国内爽妇网| 亚洲国产精品99久久| 在线观看免费高清视频97| 欧洲s码亚洲m码精品一区| 一区二区三区国产在线观看| 欧美风情在线观看| 青青草精品毛片| 日本国产精品视频| 日韩有码视频在线| 亚洲天堂开心观看| 国产精品人人做人人爽| 亚洲理论电影网| 久久综合久久八八| 欧美国产第一页| 在线视频国产日韩| 亚洲精品小视频在线观看| 欧美尺度大的性做爰视频| 欧美在线影院在线视频| 国产精品久久网| 亚洲精品福利资源站| 久久精品视频播放| 成年无码av片在线| 欧美在线观看一区二区三区| 亚洲aaaaaa| 国产精品中文字幕久久久|