乘风原创程序

  • Win32下apache,perl环境建立
  • 2009/1/8 13:49:14
  • 可以任意转载于Internet上,保留作者姓名
    保留其他权利


    本文将谈论的Windows98SE下的apache和perl。
    涉及的内容有Windows98SE下的apache和perl的安装,以及确认他们正在正常工作。
    如果你已经是apache和perl的使用者并且对Windows98SE下的apache和perl不感兴趣,
    请您跳过本文。
    本文中提到的一些方法,已经在我的机器上通过了验证,但是不排除在其他系统上不能正
    常工作的可能.

    和你一样我也是一个Perl的初学者,一个非常偶然的机会让我开始关注Perl。
    就在上个月我开始写一个很小的像留言板一样的东西,上面有每个人的名字和
    属于他的一行留言。我们有过一个VB写的类似C/S结构的东西,不过他太慢了,
    和其他的东西也格格不入。我开始考虑使用现有的IIS Server和ASP来写。
    我咨询了身边的懂ASP的朋友,他们给了我很多建议,包括使用Access数据库。
    我想我要的是一个简单东西,只不过把是让人们把自己想写的话放在那上面,
    就像公司门口的留言白板一样。就这样我开始寻找有关CGI信息。
    ====================================================================
    CGI代表通用网关接口(Common Gateway Interface)。
    本质上,CGI是运行在服务器上的程序。它可以用任何语言编写 - 只要能够在
    你的服务器上运行.
    ====================================================================
    这太好了,我可以使用我熟悉的语言和我熟悉的系统平台。我想我只要写一个
    Win32的可执行程序,放到IIS的某一个目录下就可以了。似乎远远要比这复杂,
    他们告诉我用UNIX和Apache,我的感觉好像大家都认为CGI不是属于Windows系统
    的,而是属于Unix Linux的。

    在这以后的两天我找到了Apache的Win32版本,我非常高兴,我想我又可以在我
    熟悉的系统上用我熟悉的语言写东西了。
    我想你可以在http://www.apache.org/ 找到它的最新版本。
    也可以在http://httpd.apache.org/dist/binaries/win32/ 找到WIN32上可运行的
    最新版本。
    我使用的是
    http://httpd.apache.org/dist/binaries/win32/apache_1_3_12_win32.exe
    这是一个和其他Windows应用程序的安装程序类似的安装程序,没有什么特别的地方
    唯一需要注意的是在选择安装路径的时候应该选一个短一点的路径,比如C:\apache。
    这仅仅是为了放便,和你选择一个长的路径并没有其他的不同。

    Apache的安装非常简单,在安装完之后我做了唯一的一个关于配置文件的修改
    \Apache\conf\httpd.conf文件中的
    #ServerName new.host.name行改成ServerName matrix
    你可以用你喜欢的名字,我用的是matrix

    现在就可以使用Apache了.
    在你的IE里输入http://matrix 看到内容了吗? 如果没有你可以看一看Apache\htdocs
    目录,把index.html.en改成index.html.en. 如果还是看不到试一试用你的IP地址
    像192.12.199.123或者是用http://loaclhost. 再不行我就没办法了.

    用你喜欢的语言编写CGI程序
    像上面提到的CGI程序只是一个可以在你的HTTP SERVER上运行的程序,基本上你可以用
    任何的一种编程语言编写.我使用C写了第一个程序.

    int main(int argc, char* argv[],char *envp[] )
    {
       printf("Content-type: text/html\n\n");
       printf("HELLO");
    }
    把这5句话编译成一个EXE文件(假设是HELLO.EXE),在Windows里双击这个文件,应该会打

    一个DOS窗口并且输出两句文本,像这样
    Content-type: text/html

    HELLO
    把HELLO.EXE拷贝到Apache/cgi-bin下,然后用IE访问
    http://loaclhost/cgi-bin/hello.exe
    你的IE里应该出现HELLO. 再把HELLO.EXE改成HELLO.CGI试一试.
    简单吧,下面是复杂一点的.
    当使用个GET POST方法时如何接受参数?
    这和你使用的SERVER有关,当你用Apache for win32时,GET方法的参数可以从输入变量
    argv或者环境变量里取得.
    POST方法需要读取标准输入设备.
    int main(int argc, char* argv[],char *envp[] )
    {
       printf("Content-type: text/html\n\n");
       for( i = 0; envp[i] != NULL; ++i )
       {
          printf(envp[i]);
          printf("<br>");
       }
    }
    这段程序可以显示全部的环境变量内容,像上面一样拷到cgi-bin里用IE看一看.

    读取标准输入设备: scanf("%s",&buf);像读键盘一样.当然你应该先检查一下环境变量
    CONTENT_LENGTH取得正确的参数长度.

    你得到的参数有一些是被编码的像这样
    http://loaclhost/cgi-bin/hello.exe?name=%B7%C5%BA%32%65
    编码方法是%加上两位十六进制数.两位十六进制数是字符的ASCII码.不得不编一段代码
    用于解码.
    这是C编CGI很不方便的地方,如果是Perl就简单了.
    C语言
    BOOL DeCode(LPTSTR lpStr)
    {
     int Length = strlen(lpStr);
     if (Length==0){
      *lpStr=0;
      return true;
     }
     char *pStr = new char[Length+1];
     ZeroMemory(pStr,Length+1);
     char ch;
     char ch3[3];
     int Count = 0;
     for (int i=0;i<Length;i++){
      if (*(lpStr+i)=='%')
      {
       ch3[0] = *(lpStr+i+1);
       ch3[1] = *(lpStr+i+2);
       ch3[2] = 0;
       sscanf(ch3,"%x",&ch);
       *(pStr+Count) = ch;
       Count++;
       i+=2;
      }
      else if(*(lpStr+i)=='+'){
       *(pStr+Count) = ' ';
       Count++;
      }
      else {
       *(pStr+Count) = *(lpStr+i);
       Count++;
      }
     }
     ZeroMemory(lpStr,Length);
     strcpy(lpStr,pStr);
     delete[] pStr;
     return true;
    }
    Perl语言
    ############################################################################
    # change the url code to text
    # you can access the input data such as
    # $field{'your id'}
    sub formatit()
    ############################################################################
    {
      my (%field,$name,$value,@pairs);
      my ($in) = @_;
      $field{'data'}=$in;
      @pairs = split(/&/,$in);
      foreach  (@pairs) {
      $_ =~ s/\+/ /g;
      ($name,$value) = split(/=/,$_);
      $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
      $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
      $field{$name} = $value;
      }
      return (%field);
    }
    应该是简单多了,至少代码变少了.

    接下来该开始说Perl了........
    在Windows下运行Perl程序
    Perl是一种脚本语言,所以你需要一个Perl的解释器.
    在www.cpan.org上你可以找到Perl的各种安装版本,包括WIN32的版本.
    我下载的是名为perl5.00402-bindist04-bc.zip的文件.

    安装时要比安装Apache复杂一些.Perl没有提供图形的安装界面,而使用
    了DOS的文本界面,安装程序是一个批处理文件.
    先将你下载的zip文件解压缩到一个临时的目录,你可以找到install.bat
    文件,运行他.安装程序会向你询问一些问题,像安装路径,是否安装帮助文件等等.
    特别的,会向你询问你是否有C的编译器,建议你回答No,如果想从新编译Perl
    或者进行修改,请选择yes并依照提示继续安装.

    我想你应该可以顺利的安装好,下面来试试.
    用你的笔记本程序或是其他的什么文本编辑工具,输入以下的perl程序

    #C:\perl\binperl.exe
    print "Hello Perl !!!";

    把这个文件存到磁盘上,起一个名字比如hello.pl
    现在打开一个DOS窗口,运行c:\perl\bin\perl hello.pl
    Hello Perl !!!
    看见结果了吗?
    如果没看见,检查一下是不是路径错了.

    好了下面我们用perl写一个简单的CGI程序.
    你可能会问是不是需要修改以下apache的配置以便可以运行perl的CGI程序
    不需要,你的apache已经准备好了:)
    编写以下文本,存为hellocgi.pl
    #!c:/perl/bin/perl.exe
    print "Content-type:text/html\n\n";
    print "Hello CGI";
    第一句用于指明perl.exe的位置.
    和以前我们运行C编写的CGI一样,把hellocgi.pl拷贝到apache的cgi-bin目录下
    然后用IE访问loaclhost/cgi-bin/hellocgi.pl.看到结果了吗?
    如果没有,检查一下
    1.是不是启动了apache?
    2.perl路径正确吗?

    下面是如何在IIS上运行perl cgi
    首先安装perl解释器是必须的,这和上面我们说过的一样.
    接着安装IIS,我只能假设你已经有了一个Win2K并且也已经有了可以使用的IIS.
    下面只是如何设置IIS(IIS5.0)来运行perl.
    1.从"开始"菜单->"管理工具"->"Internet服务管理器"
    2.新建虚拟目录或使用已存在目录(例:CGI-BIN)
    3.打开目录属性对话框
    4.在"应用程序设置"中
      4.1 "追加"应用程序(如果没有)
      4.2 "配置"->"应用程序映射"->"添加"
      4.3 "可执行文件"填"c:\perl\bin\perl.exe %s %s"(你的perl安装路径,注意 %s %s
    必须)