简简单单讲map(仙子译创)



QUOTE:
原帖由 "Qiang" 发表:
mod_perl 自学了一段时间,写了几个程序但没有深入的学习。 做系统管理的用途不大。 不过你有问题贴出来没准可以一起讨论。另外,英文网站你也可以去。

oh,  我想你知道我们 perlchina 的几个人正在学习 catalys..........

噢,偶也是最近刚接触mod_perl,偶们公司一部分应用(200台左右)要迁移到mod_perl,正晕呢
主要是把普通 cgi 的程序转换成可以在 mod_perl 下运行。mod_perl 上专门有篇文档介绍怎么转。
你们什么应用和 200 台机器有关?


QUOTE:
原帖由 "Qiang" 发表:
主要是把普通 cgi 的程序转换成可以在 mod_perl 下运行。mod_perl 上专门有篇文档介绍怎么转。
你们什么应用和 200 台机器有关?

你有msn吗?我们线上聊呀
mod_perl 如果想不改  code..就迁移过去...其实也挺简单的..
我这有本 mod_perl developer cookbook..
p2p 软件上好像也找得到...
这本书有介绍如何不改一行code.. 就让你代码转入mod_perl
我有部分程序已经套入mod_perl..
但是因为use warning; use strict;我都没用到..
所以我现在都不敢去看apache 的log


QUOTE:
原帖由 "apile" 发表:
mod_perl 如果想不改  code..就迁移过去...其实也挺简单的..
我这有本 mod_perl developer cookbook..
p2p 软件上好像也找得到...
这本书有介绍如何不改一行code.. 就让你代码转入mod_perl
我有部分程序已经套入..........

apile,把书发给偶看看
因为变量申明方式,偶这里不改code是不可能的
我的書是去書局買的...
厚厚的一本....
電子版的...我用edonkey有看過..
但是沒下過...你也許可以找找

但是主要設定部分如下,真的一行都不用改喔..但是只有DB connection
地方會作cache..實際測試,連數據庫真的變快了..
其他都不會..
因為我程序都沒有用use strict;
use warning;

所以error_log一堆錯誤...
你的那些代碼應該沒有我的亂才對...目前代碼只有我看得懂...

所有要用mod_perl preload的會放在/www/perl-bin目錄下....

QUOTE:
#--For Perl Module
PerlModule Apache::Reload
PerlRequire conf/startup.pl
# Optionally, if you want ot re-read startup.pl when Apache is restarted
PerlFreshRestart On
PerlWarn Off
#--Setup Variable used by Database
PerlSetVar DBASE dbi:Informix:aa@bbb
PerlSetVar DBUSER ccc
PerlSetVar DBPASS ddd
#--PerlInitHandler
PerlInitHandler Apache::Reload
PerlSetVar ReloadAll Off
#--修改完modules後,要>; touch $filename_below
PerlSetVar ReloadTouchFile /usr/local/apache/conf/reload_modules
<IfModule mod_alias.c>;
    PerlSetupEnv Off
    #
    # Note that if you include a trailing / on fakename then the server will
    # require it to be present in the URL.  So "/icons" isn't aliased in this
    # example, only "/icons/".  If the fakename is slash-terminated, then the
    # realname must also be slash terminated, and if the fakename omits the
    # trailing slash, the realname must also omit it.
    #
    Alias /icons/ "/usr/local/apache/icons/"

    <Directory "/usr/local/apache/icons">;
        Options Indexes MultiViews
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>;
    Alias /pams-www/ "/www/pp-www/"

    <Directory "/www/pp-www">;
       Options Indexes MultiViews
       AllowOverride None
       Order allow,deny
       Allow from all
    </Directory>;

    # This Alias will project the on-line documentation tree under /manual/
    # even if you change the DocumentRoot. Comment it if you don't want to
    # provide access to the on-line documentation.
    #
    Alias /manual/ "/usr/local/apache/htdocs/manual/"

    <Directory "/usr/local/apache/htdocs/manual">;
        Options Indexes FollowSymlinks MultiViews
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>;

    Alias /perl-bin/ /www/perl-bin/
    <Location /perl-bin/>;
      SetHandler perl-script
      PerlHandler Apache::Registry
      Options +ExecCGI
      PerlSendHeader On
      PerlSetupEnv On
    </Location>;

    Alias /pams-cgi/ /www/pp-cgi/
    PerlModule Apache:erlRun

    <Location /pp-cgi/>;
        AllowOverride None
        SetHandler perl-script
        PerlHandler Apache:erlRun
#        PerlHandler Apache::Registry
        Options +ExecCGI
        PerlSendHeader On
        PerlSetupEnv On
#        PerlSetVar PerlRunOnce On
        Order allow,deny
        Allow from all
    </Location>;

    #
    # ScriptAlias: This controls which directories contain server scripts.
    # ScriptAliases are essentially the same as Aliases, except that
    # documents in the realname directory are treated as applications and
    # run by the server when requested rather than as documents sent to the clie
nt.
    # The same rules about trailing "/" apply to ScriptAlias directives as to
    # Alias.
    #
    ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"

    #
    # "/usr/local/apache/cgi-bin" should be changed to whatever your ScriptAlias
ed
    # CGI directory exists, if you have that configured.
    #
    <Directory "/usr/local/apache/cgi-bin">;
        AllowOverride None
        Options None
        Order allow,deny
        Allow from all
    </Directory>;


</IfModule>;



QUOTE:
startup.pl
#!/usr/bin/perl
#--給mod_perl啟動的apache讀取,其中use部分只會Load 一次
#--

#--環境變數放在這裡 read only once
BEGIN{
  $ENV{INFORMIXDIR} = "/usr/informix";
  $ENV{"INFORMIXSERVER"}="xxxx";
  $ENV{"DB_LOCALE"}="xxxxxx";
  $ENV{"CLIENT_LOCALE"}="xxxxxx";
}

#--有自己寫的library要放在這裡
#use lib qw(/home/www/lib);

#--以下是程式會用到的modules..先Load 進memory中
use Apache:BI;
use Apache::Registry;
use Apache::RegistryLoader;
use Apache::Constants;

use DBI;
use DBD::Informix;
use DirHandle;

use strict;

#--所有Virtual Host共用同一個name space,不用針對個別
#--Virtual Host提供Environment Variables
$Apache::Reigstry::NameWithVirtualHost=0;

my $r1 = Apache::RegistryLoader->;new;
my $dh = DirHandle->;new("/www/perl-bin/" or die $!;

#--將/www/perl-bin/目錄下所有的CGI程式都precompile 進入Apache
foreach my $file($dh->;read){
  next unless $file=~ m/\.(pl|cgi)$/;

  print STDOUT "pre-loading $file\n";
#--可以選擇性的加入第三個Virtual Host Name,使得不同的Virtual
#--Host preload不同的script
  $r1->;handler("/perl-bin/$file","/www/perl-bin/$file";
}
#--也可以在這裡連結資料庫,產生一個persistent 的connection,
#--child process呼叫DBI::Connect()時如果發現已經存在就會直接使用
#--否則重新連線
#  my $r = Apache->;requrst;
#  my $DBASE = $r->;dir_config('DBASE');
#  my $DBUSER= $r->;dir_config('DBUSER');
#  my $DBPASS= $r->;dir_config('DBPASS');
#  $dbh = DBI->;connect($DBASS,$DBUSER",$DBPASS)
#         || die ("Can't connect to $qdatabase";

1;

Thanks for apile.
偶看了你的config file,与偶们的差不多,不过偶们的少了2个配置:

1)PerlModule Apache::Reload这个在产品环境中没有用到,感觉对每个request都要reload configfile有损性能;
2)Apache:erlRun这个也没用到,这个东东是在mod_perl下模拟CGI的,为什么要用上它呀?

Apache:BI是个好东东哦,but,从DBI迁移到Apache:BI,也要改code,晕
仙子姐姐好厉害


QUOTE:
原帖由 "兰花仙子" 发表:
Thanks for apile.
偶看了你的config file,与偶们的差不多,不过偶们的少了2个配置:

1)PerlModule Apache::Reload这个在产品环境中没有用到,感觉对每个request都要reload configfile有损性能;
2)Apache::..........

1.他应该是每个apache process启动的时候会自动reload ..如果你是用
mod_perl 2.0上面的要改成ModPerl而不是用Apache...这个我抄书上的...
  他好像是会reload httpd.conf的设定...或perl-bin目录下的file...:)
  忘了..应该是後者吧..
2.PerlRun..这是因为放在pp-cgi目录下的cgi..没有写得很严谨...
   所以我不敢用Registry(一般来说,用Registry效能可以更快更好)...只能
   用PerlRun...
3.Apache::DBI..我其实都没用到..你注意看下面startup.pl我把他mark掉了..
  因为所有代码都要用Apache::DBI的方式启动DBI connection..很麻烦...

目前我碰到的问题(也还没有心思去解决)....一旦DB shutdown又restart...
则apache的process的DB connection..并不晓得...後续所有的statement
都会查不到数据...只能透过apachectl restart..才能正确抓到数据...
暂时的解决方法,每天定时执行apachectl restart...:)
永久的解决方法..准备改写我连数据库那段..检查看看回来的dbh.是否可以正确抓到数据..如果不行就再重连...:)
给你叁考..


QUOTE:
原帖由 "apile" 发表:


1.他应该是每个apache process启动的时候会自动reload ..如果你是用
mod_perl 2.0上面的要改成ModPerl而不是用Apache...这个我抄书上的...
  他好像是会reload httpd.conf的设定...或perl-bin目录下的file.............

Apache::Reload是对每个request都要reload config,but,偶看你这里的config并不是对所有script都reload config,这样还好点。

关于数据库重启后,apache::dbi的影响,mailing list有人解释:

QUOTE:
Basically what is happening is you aren't called $bh->;disconnect
  at the end of your application.  When using ApacheBI you'll see
  the error there, when using DBI it will be in there.

  Because MySQL is restarting the open database connection you haveis being rolled back instead of committed. It's more of a warningand error really.

  To get rid of it simply call $dbh->;disconnect at the end of your
  application(s) or in a later Apache phase.

没test,不知是否有用