<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>idv2 &#187; python</title>
	<atom:link href="http://tech.idv2.com/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://tech.idv2.com</link>
	<description>关注Web开发技术，关注Internet。</description>
	<lastBuildDate>Tue, 27 Jul 2010 12:54:54 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>[Python]Python学习笔记</title>
		<link>http://tech.idv2.com/2008/11/03/python-memo/</link>
		<comments>http://tech.idv2.com/2008/11/03/python-memo/#comments</comments>
		<pubDate>Mon, 03 Nov 2008 07:54:16 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[编程开发]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://tech.idv2.com/2008/11/03/python-memo/</guid>
		<description><![CDATA[<!-- begin Pukiwiki generated code--><p>Ver 2: 2008/11/7 <br />
Ver 1: 2008/11/3 <br /></p>
<h2 id="content_1_0">基本概念</h2>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>Python居然支持复数。如(-5+4j)。但要注意虚数单位单独使用时要写成 1j，不能写成 j。</li>
<li>与Perl和PHP的区别：单引号和双引号没有任何区别。没有插值功能。</li>
<li>三引号：''' 和 &quot;&quot;&quot; 相当于Perl的heredoc。</li>
<li>行尾不需要用分号，分号仅用于一行写多条语句的情况。跟BASIC的冒号有些相似。</li>
<li>缩进是有语义的！建议使用TAB缩进</li>
<li>逻辑运算符只有 and or not，没有 &amp;&amp; || !</li>
<li>没有自增自减运算符，--a 相当于 -(-a)，a--语法错</li>
<li>赋值语句不是表达式，如 y = (x = 1) 语法错</li>
<li>字符串切片是很好用的: 'Hello'[0] == 'H'，以前只有Basic才有这个功能，其他语言都没有。当然Python比Basic要强大得多</li>
<li>cmp函数相当于Perl的 &lt;=&gt; 和 cmp，由于python有类型，所以无需像perl那样用两个运算符</li>
<li>[]、()、{} 的布尔值是False，跟JavaScript不同（JavaScript中空数组和空对象都是true）。与Perl类似，但Perl可以用环境来解释。</li></ul>

<h2 id="content_1_1">运算符与表达式</h2>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>运算符 ** 乘幂，Perl也有。</li>
<li>字符串的 * 表示重复，相当于Perl的 x 运算符。</li>
<li>居然还有专用于整除的 // 。别跟Perl 6的 // 混淆了。</li></ul>

<h2 id="content_1_2">控制流</h2>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>if-elif-else，Perl为if-elsif-else，bash为if-elif-fi</li>
<li>if、elif等控制流语句后面要加冒号，很像PHP的语法</li>
<li>while和for循环可以带else，循环正常结束时就会执行else。不用像C语言那样，循环结束时要检查循环变量是否等于终值，以判断是否正常结束。赞</li>
<li>range函数生成的结果不包括终点。比较：Perl的 .. 运算符包括终点。所以，Python的range(a,b)理解成C语言的 for(i=a;i&lt;b,i++) 好些。</li>
<li>什么都不做的pass语句，算是个python特色</li>
<li>enumerate能同时迭代key和value，很不错。for key, value in enumerate(LIST):</li></ul>

<h2 id="content_1_3">函数</h2>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>函数中使用全局变量需要用global关键字，类似于PHP</li>
<li>DocString，又一个python特色，函数的第一个逻辑航的字符串作为文档字符串。类似于POD和javadoc，不过是写在函数体内的。还能通过&quot;函数名.__doc__&quot;访问</li>
<li>lambda：类似于perl的闭包</li>
<li>int()函数在字符串转整数时，不能用来转浮点数字符串，也不能转包含字母的字符串。如int(&quot;1.2&quot;)、int(&quot;123abc&quot;)都是语法错误，而并不返回 1、123。</li></ul>

<h2 id="content_1_4">数据结构</h2>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>列表：定义方式为 a=[1,2]。等价于perl的数组/列表</li>
<li>元组(tuple)：定义方式为 a=(1,2)。</li>
<li>要注意列表中的列表不会被打散，如 a=[1,2], b=[a,3,4]，结果就是 b=[[1,2],3,4]。这一点与Perl不同。</li>
<li>字典：定义方式为 c={'a':1, 'b':2}。等价于perl的散列。注意两点：
<ul class="list2" style="padding-left:16px;margin-left:16px"><li>定义和访问时，key必须用引号引起来。</li>
<li>使用{}定义，使用[]访问，即c['a']。与Perl不同。</li></ul></li>
<li>列表赋值是引用赋值。要想拷贝，必须用切片：b = a[:]。Perl程序员要注意。</li>
<li>列表的sort会改变原列表。</li></ul>

<h2 id="content_1_5">例外</h2>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>try-except-finally，相当于java的try-catch-finally</li>
<li>还有else，当没有发生异常、正常结束try块时执行。跟for/while的else块一样</li>
<li>故意抛出异常叫raise，java里面叫throw</li></ul>

<h2 id="content_1_6">面向对象</h2>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>数字和字符串（对象）是不可变的。那么如何理解a=a+1？实际上是a+1创建了一个新对象赋给a，而a原来的对象被回收了。学习Python必须改变原来的“变量是个盒子”的看法</li>
<li>(-1, 100)之间的<strong>整数</strong>会被缓存，就是说即使写成 a=10; b=10; ，a和b还是同一个对象(a is b == True)</li>
<li>python的长整型是无限大的</li>
<li>类的__init__函数类似于C++的构造函数；__del__函数类似于C++的析构函数。</li>
<li>类方法定义的第一个参数必须为self，调用时这个参数会被传递为对象本身。类似于perl，perl中第一个参数也会被传递为对象本身，不过需要程序员自己写 my $self = shift; 来接收。</li>
<li>用C++的话来说，所有成员函数都是虚函数。</li>
<li>调用基类方法时要手工传递self，如 Parnet.__init__(self, name)。</li></ul>

<h2 id="content_1_7">模块</h2>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>import foo; 相当于perl的 use foo;</li>
<li>from foo import bar 相当于perl的 use foo qw/bar/;</li></ul>
<!-- end Pukiwiki generated code-->
]]></description>
			<content:encoded><![CDATA[<!-- begin Pukiwiki generated code--><p>Ver 2: 2008/11/7 <br />
Ver 1: 2008/11/3 <br /></p>
<h2 id="content_2_0">基本概念</h2>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>Python居然支持复数。如(-5+4j)。但要注意虚数单位单独使用时要写成 1j，不能写成 j。</li>
<li>与Perl和PHP的区别：单引号和双引号没有任何区别。没有插值功能。</li>
<li>三引号：''' 和 &quot;&quot;&quot; 相当于Perl的heredoc。</li>
<li>行尾不需要用分号，分号仅用于一行写多条语句的情况。跟BASIC的冒号有些相似。</li>
<li>缩进是有语义的！建议使用TAB缩进</li>
<li>逻辑运算符只有 and or not，没有 &amp;&amp; || !</li>
<li>没有自增自减运算符，--a 相当于 -(-a)，a--语法错</li>
<li>赋值语句不是表达式，如 y = (x = 1) 语法错</li>
<li>字符串切片是很好用的: 'Hello'[0] == 'H'，以前只有Basic才有这个功能，其他语言都没有。当然Python比Basic要强大得多</li>
<li>cmp函数相当于Perl的 &lt;=&gt; 和 cmp，由于python有类型，所以无需像perl那样用两个运算符</li>
<li>[]、()、{} 的布尔值是False，跟JavaScript不同（JavaScript中空数组和空对象都是true）。与Perl类似，但Perl可以用环境来解释。</li></ul>

<h2 id="content_2_1">运算符与表达式</h2>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>运算符 ** 乘幂，Perl也有。</li>
<li>字符串的 * 表示重复，相当于Perl的 x 运算符。</li>
<li>居然还有专用于整除的 // 。别跟Perl 6的 // 混淆了。</li></ul>

<h2 id="content_2_2">控制流</h2>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>if-elif-else，Perl为if-elsif-else，bash为if-elif-fi</li>
<li>if、elif等控制流语句后面要加冒号，很像PHP的语法</li>
<li>while和for循环可以带else，循环正常结束时就会执行else。不用像C语言那样，循环结束时要检查循环变量是否等于终值，以判断是否正常结束。赞</li>
<li>range函数生成的结果不包括终点。比较：Perl的 .. 运算符包括终点。所以，Python的range(a,b)理解成C语言的 for(i=a;i&lt;b,i++) 好些。</li>
<li>什么都不做的pass语句，算是个python特色</li>
<li>enumerate能同时迭代key和value，很不错。for key, value in enumerate(LIST):</li></ul>

<h2 id="content_2_3">函数</h2>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>函数中使用全局变量需要用global关键字，类似于PHP</li>
<li>DocString，又一个python特色，函数的第一个逻辑航的字符串作为文档字符串。类似于POD和javadoc，不过是写在函数体内的。还能通过&quot;函数名.__doc__&quot;访问</li>
<li>lambda：类似于perl的闭包</li>
<li>int()函数在字符串转整数时，不能用来转浮点数字符串，也不能转包含字母的字符串。如int(&quot;1.2&quot;)、int(&quot;123abc&quot;)都是语法错误，而并不返回 1、123。</li></ul>

<h2 id="content_2_4">数据结构</h2>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>列表：定义方式为 a=[1,2]。等价于perl的数组/列表</li>
<li>元组(tuple)：定义方式为 a=(1,2)。</li>
<li>要注意列表中的列表不会被打散，如 a=[1,2], b=[a,3,4]，结果就是 b=[[1,2],3,4]。这一点与Perl不同。</li>
<li>字典：定义方式为 c={'a':1, 'b':2}。等价于perl的散列。注意两点：
<ul class="list2" style="padding-left:16px;margin-left:16px"><li>定义和访问时，key必须用引号引起来。</li>
<li>使用{}定义，使用[]访问，即c['a']。与Perl不同。</li></ul></li>
<li>列表赋值是引用赋值。要想拷贝，必须用切片：b = a[:]。Perl程序员要注意。</li>
<li>列表的sort会改变原列表。</li></ul>

<h2 id="content_2_5">例外</h2>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>try-except-finally，相当于java的try-catch-finally</li>
<li>还有else，当没有发生异常、正常结束try块时执行。跟for/while的else块一样</li>
<li>故意抛出异常叫raise，java里面叫throw</li></ul>

<h2 id="content_2_6">面向对象</h2>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>数字和字符串（对象）是不可变的。那么如何理解a=a+1？实际上是a+1创建了一个新对象赋给a，而a原来的对象被回收了。学习Python必须改变原来的“变量是个盒子”的看法</li>
<li>(-1, 100)之间的<strong>整数</strong>会被缓存，就是说即使写成 a=10; b=10; ，a和b还是同一个对象(a is b == True)</li>
<li>python的长整型是无限大的</li>
<li>类的__init__函数类似于C++的构造函数；__del__函数类似于C++的析构函数。</li>
<li>类方法定义的第一个参数必须为self，调用时这个参数会被传递为对象本身。类似于perl，perl中第一个参数也会被传递为对象本身，不过需要程序员自己写 my $self = shift; 来接收。</li>
<li>用C++的话来说，所有成员函数都是虚函数。</li>
<li>调用基类方法时要手工传递self，如 Parnet.__init__(self, name)。</li></ul>

<h2 id="content_2_7">模块</h2>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>import foo; 相当于perl的 use foo;</li>
<li>from foo import bar 相当于perl的 use foo qw/bar/;</li></ul>
<!-- end Pukiwiki generated code-->
]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2008/11/03/python-memo/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Windows下Apache相关安装指南</title>
		<link>http://tech.idv2.com/2006/08/31/apache-install-note/</link>
		<comments>http://tech.idv2.com/2006/08/31/apache-install-note/#comments</comments>
		<pubDate>Wed, 30 Aug 2006 17:09:31 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[web]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://charlee.itbdns.com/tech/archive/112.html</guid>
		<description><![CDATA[本文介绍了在Windows下安装Apache、PHP、mod_perl、mod_python、subversion的方法。
<span id="more-92"></span><!-- begin Pukiwiki generated code--><div class="contents">
<a id="contents_3"></a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_3_0">  所需安装文件</a></li>
<li><a href="#content_3_1">  安装 Apache 2.0.59</a>
<ul class="list3" style="padding-left:16px;margin-left:16px"><li><a href="#content_3_2">  安装后的说明</a></li>
<li><a href="#content_3_3">  修改默认配置</a></li>
<li><a href="#content_3_4">  常见错误及修正方法</a></li>
<li><a href="#content_3_5">  为什么不使用最新版的 Apache 2.2.3</a></li></ul></li>
<li><a href="#content_3_6">  安装 php 5.1.6</a>
<ul class="list3" style="padding-left:16px;margin-left:16px"><li><a href="#content_3_7">  PHP各个目录的作用</a></li>
<li><a href="#content_3_8">  添加 mysql 支持</a></li></ul></li>
<li><a href="#content_3_9">  安装 ActivePerl 5.8.8</a></li>
<li><a href="#content_3_10">  安装 mod_perl 2.0.2</a>
<ul class="list3" style="padding-left:16px;margin-left:16px"><li><a href="#content_3_11">  测试CGI脚本的执行</a></li>
<li><a href="#content_3_12">  测试 mod_perl Apache Handler 的执行</a></li></ul></li>
<li><a href="#content_3_13">  安装 python 2.3.5</a>
<ul class="list3" style="padding-left:16px;margin-left:16px"><li><a href="#content_3_14">  为什么不使用 python 2.4 或 python 2.5 版本</a></li></ul></li>
<li><a href="#content_3_15">  安装 mod_python</a></li>
<li><a href="#content_3_16">  安装 subversion</a></li></ul>
</div>

<hr class="full_hr" />
<h3 id="content_3_0">所需安装文件</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>Apache 2.0.59</strong>：<a href="http://httpd.apache.org/download.cgi">下载 Apache HTTP Server 2.0.59 Win32 Binary (MSI Installer)</a></li>
<li><strong>php 5.1.6</strong>：<a href="http://www.php.net/downloads.php">下载 Windows Binaries - php 5.1.6 zip package</a></li>
<li><strong>ActivePerl 5.8.8</strong>：<a href="http://www.activestate.com/Products/Download/Download.plex?id=ActivePerl">下载 ActivePerl 5.8.8.817 Windows MSI</a></li>
<li><strong>mod_perl 2.0.2</strong>：通过 ppm 安装，无须事先下载</li>
<li><strong>Python 2.3.5</strong>：<a href="http://www.python.org/download/">下载Python 2.3.5</a></li>
<li><strong>mod_python</strong>：<a href="http://www.meisei-u.ac.jp/mirror/apache/dist/httpd/modpython/win/3.2.10/">下载mod_python 3.2.10</a>，注意要下载 mod_python-3.2.10.win32-py2.3-apache2.0.exe 文件。</li>
<li><strong>subversion</strong>：<a href="http://subversion.tigris.org/project_packages.html">下载 subversion 1.3.2</a>，建议下载 zip 版 svn-win32-1.3.2.zip。</li></ul>
<p>另外，为了在安装失败时查找原因，最好事先准备好 <a href="http://www.dependencywalker.com/">Dependency Walker</a> 这个工具。
该工具可以查看程序运行所必需的 .dll 文件。如果你已经安装了 Microsoft Visual C++ 6.0，那么其中已经包含了该工具，就不必再重新下载了。</p>

<h3 id="content_3_1">安装 Apache 2.0.59</h3>
<p>双击 apache_2.0.59-win32-x86-no_ssl.msi 文件开始安装。
安装过程很简单，一路Next即可。途中要求输入服务器的域名、
服务器名及管理员信箱，输入相应的正确信息。
如果仅仅是安装在本地用于测试，则可按照下图所示输入。</p>
<div class="img_margin" style="text-align:left"><img src="http://tech.idv2.com/wp-content/uploads/2006/09/apache2_install.png" alt="apache2_install.png" title="apache2_install.png" width="504" height="381" /></div>

<p>安装成功之后打开浏览器，在地址栏中输入 <a href="http://localhost/">http://localhost/</a>。
如果你能看到 Apache 的欢迎页面以及 Apache 的红羽毛的图标，则说明安装成功。
否则请参考下面的说明查找失败原因。</p>

<h4 id="content_3_2">安装后的说明</h4>
<p>默认安装路径为 C:\Program Files\Apache Group\Apache2。
安装程序会建立一个名为 Apache2 的系统服务并自动启动它，
可以通过<strong>右键单击我的电脑-&gt;管理-&gt;服务</strong>确认其存在，如下图。</p>
<div class="img_margin" style="text-align:left"><img src="http://tech.idv2.com/wp-content/uploads/2006/09/apache2_service.png" alt="apache2_service.png" title="apache2_service.png" width="472" height="370" /></div>

<p>另外，安装结束后系统托盘中会多出一个 Apache 的控制图标（如下图），
可以通过它来控制 Apache 的启动与停止。如果你想通过系统服务来控制
Apache 的话，可以从<strong>开始菜单-&gt;程序-&gt;启动</strong>中删除<strong>Monitor Apache Servers</strong>
项，下次启动计算机时就不会启动该图标。</p>
<div class="img_margin" style="text-align:left"><img src="http://tech.idv2.com/wp-content/uploads/2006/09/apache2_monitor_trayicon.png" alt="apache2_monitor_trayicon.png" title="apache2_monitor_trayicon.png" width="155" height="31" /></div>

<p>Apache的安装目录结构如下图：</p>
<div class="img_margin" style="text-align:left"><img src="http://tech.idv2.com/wp-content/uploads/2006/09/apache2_tree.png" alt="apache2_tree.png" title="apache2_tree.png" width="155" height="237" /></div>

<p>其中各个目录的含义如下。</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>bin</strong> - Apache的程序文件和库文件(.dll)。</li>
<li><strong>cgi-bin</strong> - 网站的脚本的保存位置。</li>
<li><strong>conf</strong> - 配置文件。</li>
<li><strong>error</strong> - 各种错误页面。</li>
<li><strong>htdocs</strong> - 网站的内容。</li>
<li><strong>icons</strong> - Apache生成文件列表时使用的各种图标。</li>
<li><strong>include</strong> - 程序开发时使用的头文件。</li>
<li><strong>lib</strong> - 程序开发时使用的静态库文件。</li>
<li><strong>logs</strong> - 服务器访问日志和错误日志。</li>
<li><strong>manual</strong> - 使用手册。</li>
<li><strong>modules</strong> - 扩展模块，其下有许多扩展名为 .so 的文件，实质上都是Windows .dll文件。</li>
<li><strong>proxy</strong> - 使用Apache作代理时的缓存目录。</li></ul>

<h4 id="content_3_3">修改默认配置</h4>
<p>默认情况下网站内容位于 Apache2/htdocs 下，而实际应用中很少讲网站内容和服务器程序放在一起。
因此我们要做的第一步就是修改网站内容的位置。</p>
<p>我们假设网站的静态内容位于 D:\wwwroot\htdocs 下，而脚本程序位于 D:\wwwroot\cgi-bin 下。
那么首先要建立这两个目录。</p>
<p>之后打开 httpd.conf 文件，找到这一行：</p>
<pre>DocumentRoot &quot;C:/Program Files/Apache Group/Apache2/htdocs&quot;</pre>
<p>将其修改成：</p>
<pre>DocumentRoot &quot;D:/wwwroot/htdocs&quot;</pre>
<p>然后找到这样的内容（各行之间可能夹杂着注释）：</p>
<pre>&lt;Directory &quot;C:/Program Files/Apache Group/Apache2/htdocs&quot;&gt;
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
&lt;/Directory&gt;</pre>
<p>这一段是定义网站主目录的权限。我们应当修改主目录的位置。另外，Indexes 权限表示
当某个目录下不存在 index.html 文件时，显示该目录的文件列表。实际应用中这会造成安全
漏洞，应当将其删除。修改之后的内容如下：</p>
<pre>&lt;Directory &quot;D:/wwwroot/htdocs&quot;&gt;
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
&lt;/Directory&gt;</pre>
<p>然后找到这一行：</p>
<pre>ScriptAlias /cgi-bin/ &quot;C:/Program Files/Apache Group/Apache2/cgi-bin/&quot;</pre>
<p>将其修改为：</p>
<pre>ScriptAlias /cgi-bin/ &quot;D:/wwwroot/cgi-bin/&quot;</pre>
<p>再找到这样的内容：</p>
<pre>&lt;Directory &quot;C:/Program Files/Apache Group/Apache2/cgi-bin&quot;&gt;
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
&lt;/Directory&gt;</pre>
<p>将其修改为：</p>
<pre>&lt;Directory &quot;D:/wwwroot/cgi-bin&quot;&gt;
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
&lt;/Directory&gt;</pre>
<p>这样配置文件修改完毕。在系统服务中选择 Apache2 服务单击“重新启动服务”按钮，
或者在系统托盘的Apache图标中选择Restart，或者通过命令行输入以下命令来重新启动 Apache。</p>
<pre>C:\&gt; net stop apache2
C:\&gt; net start apache2</pre>
<p>如果配置文件修改无误，则应当正常重新启动。之后打开浏览器输入 <a href="http://localhost/">http://localhost/</a>，
你应当看到一条“Forbidden”的错误信息。然后建立 D:\wwwroot\htdocs\index.html 文件，
内容随意。再次用浏览器打开 <a href="http://localhost/">http://localhost/</a>，应当能看到建立的 index.html 文件的内容。</p>
<p>为了以后安装其他模块，我们应当修改系统变量 PATH 以便其他模块能够找到 Apache 的程序库。
在<strong>控制面板-&gt;系统-&gt;高级-&gt;环境变量</strong>对话框中，编辑系统变量中的 <strong>Path</strong>，
在其最前面添加以下内容：</p>
<pre>C:\Program Files\Apache Group\Apache2\bin;</pre>
<p>修改之后，继续安装下面的模块之前，建议重新启动计算机以避免不必要的错误。</p>

<h4 id="content_3_4">常见错误及修正方法</h4>

<h4 id="content_3_5">为什么不使用最新版的 Apache 2.2.3</h4>
<p>Apache 2.0.x 版本的 Windows 版使用 Visual C++ 6.0 编译，而 Apache 2.2.x 版本的 Windows版
使用 Visual Studio .NET 编译。由于编译器不同，导致使用的程序库也不同，因此 Apache 2.0.x
和 Apache 2.2.x 不能兼容。目前，许多 Apache 的功能扩展模块仅能工作于 Apache 2.0.x 下，
包括 php、subversion 等。要想使用这些功能，就必须要安装 Apache 2.0.x 版。</p>
<p>当然，这仅限于 Windows 版。其他操作系统上的 Apache 不受此限。</p>

<h3 id="content_3_6">安装 php 5.1.6</h3>
<p>php的安装相对较简单。为了管理方便，我们将 php 与 Apache 放在一起。</p>
<p>首先将 php-5.1.6-Win32.zip 解压到 C:\Program Files\Apache Group\Apache2\php5 目录下。</p>
<p>php5中的 Apache2 模块为 <strong>php5apache2.dll</strong>（注意不是 php5apache.dll，那个是 Apache 1.3.x 的模块）。
修改 Apache2/conf 目录下的 httpd.conf 以加载 php5 模块。查找 <strong>LoadModule</strong>，
然后在其附近添加以下内容以加载php5模块，并设置 php.ini 的位置。</p>
<pre>LoadModule php5_module php5/php5apache2.dll
PHPIniDir php5</pre>
<p>然后查找<strong>AddType</strong>，在其附近添加以下内容，以增加 php 的类型。</p>
<pre>AddType application/x-httpd-php .php</pre>
<p>再查找<strong>DirectoryIndex</strong>命令，将其修改为以下内容，增加目录的默认文档 index.php。</p>
<pre>DirectoryIndex index.html index.html.var index.htm index.php</pre>
<p>然后进入 php5 目录，复制 <strong>php.ini-dist</strong> 文件为 <strong>php.ini</strong>。
然后修改 php.ini，查找 <strong>extension_dir</strong>，该变量指定了 php 功能模块的位置。
将其修改为以下的内容。</p>
<pre>extension_dir = &quot;./php5/ext&quot;</pre>
<p>注意，这个路径是从 Apache2 下开始算起，而不是从 Apache2/php5 下开始。</p>
<p>查找 session.save_path，这个变量指定session的保存位置。
将其前面的分号去掉，然后修改该行为以下内容：</p>
<pre>session.save_path = &quot;C:\Program Files\Apache Group\Apache2\tmp&quot;</pre>
<p>然后在 Apache2 目录下建立 <strong>tmp</strong> 目录，作为session的保存目录。</p>
<p>最后重新启动 Apache 服务器（方法参考 Apache 安装一节）。
为测试 php 是否安装成功，在文档目录 D:\wwwroot\htdocs 下建立 phpinfo.php 文件，内容如下：</p>
<pre>&lt;?php
  phpinfo();
?&gt;</pre>
<p>然后打开浏览器，访问 <a href="http://localhost/phpinfo.php">http://localhost/phpinfo.php</a> 。如果能看到 php 的信息页，
即表明php安装成功。</p>

<h4 id="content_3_7">PHP各个目录的作用</h4>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>dev</strong> - 开发用 php 静态库。</li>
<li><strong>ext</strong> - php扩展模块。</li>
<li><strong>extras</strong> - 相关文件。</li>
<li><strong>PEAR</strong> - 访问php模块网站 PEAR 的必要文件。</li></ul>
<p>另外，php目录下的部分文件功能如下。</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>php.exe</strong> - php的命令行解释程序，也可用作 CGI 解释器。</li>
<li><strong>php5apache2.dll</strong> - Apache 2.0的PHP模块。</li>
<li><strong>php5apache.dll</strong> - Apache 1.3的PHP模块。</li>
<li><strong>php5isapi.dll</strong> - Microsoft IIS的PHP模块。</li>
<li><strong>php5nsapi.dll</strong> - Netscape Server的PHP模块。</li>
<li><strong>php5ts.dll</strong> - PHP及其扩展模所需的库文件。</li></ul>

<h4 id="content_3_8">添加 mysql 支持</h4>
<p>php4之前的版本自带mysql，而在php5中，mysql不再默认支持。为了使php5支持mysql，
我们需要稍稍修改一下设置。</p>
<p>打开 php5/php.ini 文件，查找下面这一行，并将其前面的注释符号分号 ; 去掉。</p>
<pre>extension=php_mysql.dll</pre>
<p>但是这样还不能使用mysql功能，因为 php_mysql.dll 需要 php5 目录下的 php5ts.dll 和 libmysql.dll
（可以使用 Dependency Walker 打开 php_mysql.dll 查看），但是这两个 DLL 文件既不与 php_mysql.dll
位于同一目录下，也没有和可执行文件Apache.exe 位于同一目录下，因此 php_mysql.dll 找不到这两个DLL，
不能启动。解决方法就是将 php5ts.dll 和 libmysql.dll 复制到 Apache2/bin 下，然后重新启动 Apache2。</p>
<p>使用浏览器打开前面的 phpinfo.php 页面，可以看到页面输出的中部有 mysql 模块的配置，
说明 mysql 模块已经正常安装。</p>

<h3 id="content_3_9">安装 ActivePerl 5.8.8</h3>
<p>ActivePerl是Perl的一个Win32移植版。安装方法很简单，运行 ActivePerl-5.8.8.817-MSWin32-x86-257965.msi ，
即出现安装界面，一路 Next 即可。默认情况下安装到 C:\Perl 下。
注意在选择功能时务必选择 PPM 3.0，该程序能够很方便地安装各种Perl模块。</p>
<p>下一步需要在系统环境变量中增加 Perl 所在的位置。如果你在安装Perl时选择了
Add Perl to the PATH enviroment variable，则可以省略这一步。
否则打开<strong>控制面板-&gt;系统-&gt;高级-&gt;环境变量</strong>，修改系统变量中的 Path，
在其最前面增加以下内容：</p>
<pre>C:\Perl\bin;</pre>
<p>修改环境变量后，在安装 mod_perl 之前，最好能重新启动计算机。</p>

<h3 id="content_3_10">安装 mod_perl 2.0.2</h3>
<p>mod_perl是Apache的Perl扩展模块。它模拟了一个Perl的CGI执行环境，以便在Apache中执行Perl脚本。
但是mod_perl要比真正的Perl CGI的性能高上百倍。</p>
<p>Apache 2.0.x 系列对应的 mod_perl 第二版，mod_perl目前最新版本是 2.0.2。
可以使用Perl包管理工具 ppm 进行安装。</p>
<p>首先启动命令行提示符（<strong>开始-&gt;运行-&gt;输入cmd，OK</strong>），然后输入 <strong>ppm</strong>，
即可启动 ppm。如果启动失败，看看是否在安装 ActivePerl 的时候忘记添加 Path 环境变量了。
下面以 ppm&gt; 开头的行为输入的命令，其他行为输出结果。 # 符号后面为注释。</p>
<pre># 添加repository。repository为存放Perl模块的网站。
ppm&gt; repos add &quot;uwinnipeg Perl 5.8 repository&quot; http://theoryx5.uwinnipeg.ca/cgi-bin/ppmserver?urn:/PPMServer58
Repositories:
[1] ActiveState Package Repository
[2] uwinnipeg Perl 5.8 repository

# 搜索 mod_perl 模块
ppm&gt; search mod_perl
Searching in Active Repositories
  1. Apache-mod_perl_guide        [1.31] Apache-mod_perl_guide
  2. mod_perl                    [2.0.2] Embed a Perl interpreter in the Apache/2.0 HTTP server
  3. mod_perl-1            [1.29_01-dev] Embed a Perl interpreter in the Apache/1.3.27 HTTP server
  4. mod_perl-2.2            [2.0.3-dev] Embed a Perl interpreter in the Apache/2.2 HTTP server
  5. mod_perl-eapi-1       [1.29_01-dev] Embed a Perl interpreter in the Apache/1.3.27 HTTP server (with EAPI support)

# 搜索结果中第2项为我们要安装的 mod_perl 2.0.2，使用install命令进行安装
ppm&gt; install 2
Package 2:
====================
Install 'mod_perl' version 2.0.2 in ActivePerl 5.8.8.817.
====================
Downloaded 948125 bytes.
......

# 安装途中会询问 Apache 的模块安装位置，输入 C:\Program Files\Apache Group\Apache2\modules
Fetching http://theoryx5.uwinnipeg.ca/ppms/x86/mod_perl.so ...  done!
Where should mod_perl.so be placed? [D:/Apache2/modules] C:\Program Files\Apache Group\Apache2\modules   # 输入路径
......
Successfully installed mod_perl version 2.0.2 in ActivePerl 5.8.8.817.</pre>
<pre># 退出 ppm
ppm&gt; exit</pre>
<p>安装完毕之后，我们可以在 Apache2/modules 目录下发现刚刚安装的 mod_perl.so 文件。
下面我们要将此文件加载到 Apache 中。</p>
<p>打开 Apache2/conf 目录下的 httpd.conf文件，查找 <strong>LoadModule</strong>，
在其附近添加以下内容：</p>
<pre>
#LoadFile &quot;C:/Perl/bin/perl58.dll&quot;    # 如果你没有在环境变量path中添加 C:\Perl\bin 则需要这一行
LoadModule perl_module modules/mod_perl.so

# 添加mod_perl配置内容，并利用其处理 cgi-bin 下的脚本文件
&lt;Directory &quot;D:/wwwroot/cgi-bin&quot;&gt;
    SetHandler perl-script
    PerlResponseHandler ModPerl::Registry
    PerlOptions +ParseHeaders
    Options +ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
&lt;/Directory&gt;</pre>
<p>修改完成之后重新启动 Apache，mod_perl 即安装成功。
你可以在系统服务中看到 Apache2 服务的描述中多了 mod_perl/2.0.2 Perl/v5.8.8 的字样。</p>

<h4 id="content_3_11">测试CGI脚本的执行</h4>
<p>上面我们已经设置 cgi-bin 目录下的所有程序都使用 mod_perl 进行处理。这里我们执行一个脚本以确认其是否正常。</p>
<p>在 D:/wwwroot/cgi-bin 目录下建立 hello.cgi 文件，内容如下。
(实际上，该文件可以是任意扩展名，我们在Apache配置中用 Directory 指令指定 cgi-bin 目录，
因此 cgi-bin 下所有的文件都将被 mod_perl 处理。)</p>
<pre># hello.cgi
print &quot;Contennt-Type: text/html\n\n&quot;;
print &quot;Hello, world! This is a CGI.&quot;;</pre>
<p>保存之后在浏览器中输入 <a href="http://localhost/cgi-bin/hello.cgi">http://localhost/cgi-bin/hello.cgi</a> ，如能得到下面的结果则说明 mod_perl 工作正常。</p>
<pre>Hello, world! This is a CGI.</pre>
<p>如果显示 Internal Server Error，可参考 logs/httpd-error.log 文件中的错误信息。</p>

<h4 id="content_3_12">测试 mod_perl Apache Handler 的执行</h4>
<p>mod_perl 的另一种执行方法就是编写 Apache Handler。Apache Handler 是一个Perl模块，
在 Apache 启动时读入并常驻内存，用来处理Web请求。</p>
<p>在 D:/wwwroot 下建立 lib 目录，用于保存 Perl 模块。我们将建立 HelloWorld::Hello 模块，
内容为显示 “Hello, world”。为建立这个模块，我们需要进行以下的工作。</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>建立模块本身</li>
<li>将模块的位置放到 @INC 变量中以便 mod_perl 能找到我们建立的模块</li>
<li>修改 httpd.conf，设置使用该模块的位置</li></ul>
<p>在 lib 下建立 HelloWorld 目录，并在 HelloWorld 目录下建立 Hello.pm 文件，其内容如下。</p>
<pre>package HelloWorld::Hello;

use strict;
use warnings;
use Apache2::RequestRec ();
use Apache2::RequestIO ();
use Apache2::Const -compile =&gt; qw(OK);

sub handler {
    my $r = shift;
    $r-&gt;content_type('text/plain');
    print &quot;Hello, world! This is an Apache Handler.\n&quot;;
    return Apache2::Const::OK;
}
1;</pre>
<p>书写Perl模块时注意不要忘记最后的 1; ，如果没有的话 mod_perl 会出错。
（该文件的完整路径为 D:\wwwroot\lib\HelloWorld\Hello.pm，不要弄错了。）</p>
<p>然后我们需要将 HelloWorld::Hello 模块的位置告诉 mod_perl。
在 D:\wwwroot\lib 下建立 startup.pl 文件，内容如下：</p>
<pre>use lib qw(D:/wwwroot/lib);
1;</pre>
<p>然后修改 httpd.conf，加入下面的设置。</p>
<pre>PerlRequire &quot;D:/wwwroot/lib/startup.pl&quot;</pre>
<p>现在这个模块已经可以使用了。我们只需告诉 Apache 在什么情况下使用该模块。
修改 httpd.conf，加入下面的设置。</p>
<pre>&lt;Location /hello&gt;
    SetHandler perl-script
    PerlResponseHandler HelloWorld::Hello
&lt;/Location&gt;</pre>
<p>最后重新启动 Apache。在浏览器中打开 <a href="http://localhost/hello">http://localhost/hello</a>，应当能看到下面的文字：</p>
<pre>Hello, world! This is an Apache Handler.</pre>

<h3 id="content_3_13">安装 python 2.3.5</h3>
<p>双击 Python-2.3.5.exe 进行安装。默认的安装目录为 C:\Python23。</p>

<h4 id="content_3_14">为什么不使用 python 2.4 或 python 2.5 版本</h4>

<h3 id="content_3_15">安装 mod_python</h3>
<p>双击 mod_python-3.2.10.win32-py2.3-apache2.0.exe 进行安装。
安装程序会检测 Python 和 Apache 的安装路径，并将 mod_python.so 安装至 Apache2/modules 目录下。</p>
<p>打开 Apache2/conf/httpd.conf，查找 <strong>LoadModule</strong>，并在其附近添加以下内容。</p>
<pre>LoadModule python_module modules/mod_python.so</pre>
<p>最后重新启动 Apache2。</p>

<h3 id="content_3_16">安装 subversion</h3>
<p>subversion是一个优秀的版本控制系统，它能够完整地记录软件开发过程中源代码的变动，
并可以随时将源代码恢复到以前的任意版本。subversion的服务器可以单独使用，
也可以作为 Apache 的模块，通过 WebDAV 协议使用。</p>
<p>在 subversion 的<a href="http://subversion.tigris.org/project_packages.html">下载页面</a>上，
你会看到关于 Windows 版的说明，简单来讲就是 subversion 没有 Python 2.4 binding，
也就是说，使用 Python 2.4 不能对 subversion 进行编程，这也是我们不使用 Python 2.4
的一个原因。</p>
<p>将 svn-win32-1.3.2.zip 解压到 C:\svn 下。由于 svn 的 Apache2 模块
需要 C:\svn\bin 下的 intl3_svn.dll 和 libdb43.dll 文件，
所以要在环境变量 Path 中增加下面的内容，并重新启动计算机。</p>
<pre>C:\svn\bin;</pre>
<p>将 C:\svn\bin 下的 mod_dav_svn.so 文件复制到 Apache2/modules 目录下。</p>
<p>打开 Apache2/conf/httpd.conf 文件，
然后查找下面这一行，去掉其前面的注释符号 # 。</p>
<pre>LoadModule dav_module modules/mod_dav.so</pre>
<p>查找 <strong>LoadModule</strong>，并在其附近添加以下内容。</p>
<pre>LoadModule dav_svn_module modules/mod_dav_svn.so</pre>
<p>最后重新启动 Apache2。</p>
<!-- end Pukiwiki generated code-->
]]></description>
			<content:encoded><![CDATA[本文介绍了在Windows下安装Apache、PHP、mod_perl、mod_python、subversion的方法。
<span id="more-92"></span><!-- begin Pukiwiki generated code--><div class="contents">
<a id="contents_4"></a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_4_0">  所需安装文件</a></li>
<li><a href="#content_4_1">  安装 Apache 2.0.59</a>
<ul class="list3" style="padding-left:16px;margin-left:16px"><li><a href="#content_4_2">  安装后的说明</a></li>
<li><a href="#content_4_3">  修改默认配置</a></li>
<li><a href="#content_4_4">  常见错误及修正方法</a></li>
<li><a href="#content_4_5">  为什么不使用最新版的 Apache 2.2.3</a></li></ul></li>
<li><a href="#content_4_6">  安装 php 5.1.6</a>
<ul class="list3" style="padding-left:16px;margin-left:16px"><li><a href="#content_4_7">  PHP各个目录的作用</a></li>
<li><a href="#content_4_8">  添加 mysql 支持</a></li></ul></li>
<li><a href="#content_4_9">  安装 ActivePerl 5.8.8</a></li>
<li><a href="#content_4_10">  安装 mod_perl 2.0.2</a>
<ul class="list3" style="padding-left:16px;margin-left:16px"><li><a href="#content_4_11">  测试CGI脚本的执行</a></li>
<li><a href="#content_4_12">  测试 mod_perl Apache Handler 的执行</a></li></ul></li>
<li><a href="#content_4_13">  安装 python 2.3.5</a>
<ul class="list3" style="padding-left:16px;margin-left:16px"><li><a href="#content_4_14">  为什么不使用 python 2.4 或 python 2.5 版本</a></li></ul></li>
<li><a href="#content_4_15">  安装 mod_python</a></li>
<li><a href="#content_4_16">  安装 subversion</a></li></ul>
</div>

<hr class="full_hr" />
<h3 id="content_4_0">所需安装文件</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>Apache 2.0.59</strong>：<a href="http://httpd.apache.org/download.cgi">下载 Apache HTTP Server 2.0.59 Win32 Binary (MSI Installer)</a></li>
<li><strong>php 5.1.6</strong>：<a href="http://www.php.net/downloads.php">下载 Windows Binaries - php 5.1.6 zip package</a></li>
<li><strong>ActivePerl 5.8.8</strong>：<a href="http://www.activestate.com/Products/Download/Download.plex?id=ActivePerl">下载 ActivePerl 5.8.8.817 Windows MSI</a></li>
<li><strong>mod_perl 2.0.2</strong>：通过 ppm 安装，无须事先下载</li>
<li><strong>Python 2.3.5</strong>：<a href="http://www.python.org/download/">下载Python 2.3.5</a></li>
<li><strong>mod_python</strong>：<a href="http://www.meisei-u.ac.jp/mirror/apache/dist/httpd/modpython/win/3.2.10/">下载mod_python 3.2.10</a>，注意要下载 mod_python-3.2.10.win32-py2.3-apache2.0.exe 文件。</li>
<li><strong>subversion</strong>：<a href="http://subversion.tigris.org/project_packages.html">下载 subversion 1.3.2</a>，建议下载 zip 版 svn-win32-1.3.2.zip。</li></ul>
<p>另外，为了在安装失败时查找原因，最好事先准备好 <a href="http://www.dependencywalker.com/">Dependency Walker</a> 这个工具。
该工具可以查看程序运行所必需的 .dll 文件。如果你已经安装了 Microsoft Visual C++ 6.0，那么其中已经包含了该工具，就不必再重新下载了。</p>

<h3 id="content_4_1">安装 Apache 2.0.59</h3>
<p>双击 apache_2.0.59-win32-x86-no_ssl.msi 文件开始安装。
安装过程很简单，一路Next即可。途中要求输入服务器的域名、
服务器名及管理员信箱，输入相应的正确信息。
如果仅仅是安装在本地用于测试，则可按照下图所示输入。</p>
<div class="img_margin" style="text-align:left"><img src="http://tech.idv2.com/wp-content/uploads/2006/09/apache2_install.png" alt="apache2_install.png" title="apache2_install.png" width="504" height="381" /></div>

<p>安装成功之后打开浏览器，在地址栏中输入 <a href="http://localhost/">http://localhost/</a>。
如果你能看到 Apache 的欢迎页面以及 Apache 的红羽毛的图标，则说明安装成功。
否则请参考下面的说明查找失败原因。</p>

<h4 id="content_4_2">安装后的说明</h4>
<p>默认安装路径为 C:\Program Files\Apache Group\Apache2。
安装程序会建立一个名为 Apache2 的系统服务并自动启动它，
可以通过<strong>右键单击我的电脑-&gt;管理-&gt;服务</strong>确认其存在，如下图。</p>
<div class="img_margin" style="text-align:left"><img src="http://tech.idv2.com/wp-content/uploads/2006/09/apache2_service.png" alt="apache2_service.png" title="apache2_service.png" width="472" height="370" /></div>

<p>另外，安装结束后系统托盘中会多出一个 Apache 的控制图标（如下图），
可以通过它来控制 Apache 的启动与停止。如果你想通过系统服务来控制
Apache 的话，可以从<strong>开始菜单-&gt;程序-&gt;启动</strong>中删除<strong>Monitor Apache Servers</strong>
项，下次启动计算机时就不会启动该图标。</p>
<div class="img_margin" style="text-align:left"><img src="http://tech.idv2.com/wp-content/uploads/2006/09/apache2_monitor_trayicon.png" alt="apache2_monitor_trayicon.png" title="apache2_monitor_trayicon.png" width="155" height="31" /></div>

<p>Apache的安装目录结构如下图：</p>
<div class="img_margin" style="text-align:left"><img src="http://tech.idv2.com/wp-content/uploads/2006/09/apache2_tree.png" alt="apache2_tree.png" title="apache2_tree.png" width="155" height="237" /></div>

<p>其中各个目录的含义如下。</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>bin</strong> - Apache的程序文件和库文件(.dll)。</li>
<li><strong>cgi-bin</strong> - 网站的脚本的保存位置。</li>
<li><strong>conf</strong> - 配置文件。</li>
<li><strong>error</strong> - 各种错误页面。</li>
<li><strong>htdocs</strong> - 网站的内容。</li>
<li><strong>icons</strong> - Apache生成文件列表时使用的各种图标。</li>
<li><strong>include</strong> - 程序开发时使用的头文件。</li>
<li><strong>lib</strong> - 程序开发时使用的静态库文件。</li>
<li><strong>logs</strong> - 服务器访问日志和错误日志。</li>
<li><strong>manual</strong> - 使用手册。</li>
<li><strong>modules</strong> - 扩展模块，其下有许多扩展名为 .so 的文件，实质上都是Windows .dll文件。</li>
<li><strong>proxy</strong> - 使用Apache作代理时的缓存目录。</li></ul>

<h4 id="content_4_3">修改默认配置</h4>
<p>默认情况下网站内容位于 Apache2/htdocs 下，而实际应用中很少讲网站内容和服务器程序放在一起。
因此我们要做的第一步就是修改网站内容的位置。</p>
<p>我们假设网站的静态内容位于 D:\wwwroot\htdocs 下，而脚本程序位于 D:\wwwroot\cgi-bin 下。
那么首先要建立这两个目录。</p>
<p>之后打开 httpd.conf 文件，找到这一行：</p>
<pre>DocumentRoot &quot;C:/Program Files/Apache Group/Apache2/htdocs&quot;</pre>
<p>将其修改成：</p>
<pre>DocumentRoot &quot;D:/wwwroot/htdocs&quot;</pre>
<p>然后找到这样的内容（各行之间可能夹杂着注释）：</p>
<pre>&lt;Directory &quot;C:/Program Files/Apache Group/Apache2/htdocs&quot;&gt;
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
&lt;/Directory&gt;</pre>
<p>这一段是定义网站主目录的权限。我们应当修改主目录的位置。另外，Indexes 权限表示
当某个目录下不存在 index.html 文件时，显示该目录的文件列表。实际应用中这会造成安全
漏洞，应当将其删除。修改之后的内容如下：</p>
<pre>&lt;Directory &quot;D:/wwwroot/htdocs&quot;&gt;
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
&lt;/Directory&gt;</pre>
<p>然后找到这一行：</p>
<pre>ScriptAlias /cgi-bin/ &quot;C:/Program Files/Apache Group/Apache2/cgi-bin/&quot;</pre>
<p>将其修改为：</p>
<pre>ScriptAlias /cgi-bin/ &quot;D:/wwwroot/cgi-bin/&quot;</pre>
<p>再找到这样的内容：</p>
<pre>&lt;Directory &quot;C:/Program Files/Apache Group/Apache2/cgi-bin&quot;&gt;
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
&lt;/Directory&gt;</pre>
<p>将其修改为：</p>
<pre>&lt;Directory &quot;D:/wwwroot/cgi-bin&quot;&gt;
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
&lt;/Directory&gt;</pre>
<p>这样配置文件修改完毕。在系统服务中选择 Apache2 服务单击“重新启动服务”按钮，
或者在系统托盘的Apache图标中选择Restart，或者通过命令行输入以下命令来重新启动 Apache。</p>
<pre>C:\&gt; net stop apache2
C:\&gt; net start apache2</pre>
<p>如果配置文件修改无误，则应当正常重新启动。之后打开浏览器输入 <a href="http://localhost/">http://localhost/</a>，
你应当看到一条“Forbidden”的错误信息。然后建立 D:\wwwroot\htdocs\index.html 文件，
内容随意。再次用浏览器打开 <a href="http://localhost/">http://localhost/</a>，应当能看到建立的 index.html 文件的内容。</p>
<p>为了以后安装其他模块，我们应当修改系统变量 PATH 以便其他模块能够找到 Apache 的程序库。
在<strong>控制面板-&gt;系统-&gt;高级-&gt;环境变量</strong>对话框中，编辑系统变量中的 <strong>Path</strong>，
在其最前面添加以下内容：</p>
<pre>C:\Program Files\Apache Group\Apache2\bin;</pre>
<p>修改之后，继续安装下面的模块之前，建议重新启动计算机以避免不必要的错误。</p>

<h4 id="content_4_4">常见错误及修正方法</h4>

<h4 id="content_4_5">为什么不使用最新版的 Apache 2.2.3</h4>
<p>Apache 2.0.x 版本的 Windows 版使用 Visual C++ 6.0 编译，而 Apache 2.2.x 版本的 Windows版
使用 Visual Studio .NET 编译。由于编译器不同，导致使用的程序库也不同，因此 Apache 2.0.x
和 Apache 2.2.x 不能兼容。目前，许多 Apache 的功能扩展模块仅能工作于 Apache 2.0.x 下，
包括 php、subversion 等。要想使用这些功能，就必须要安装 Apache 2.0.x 版。</p>
<p>当然，这仅限于 Windows 版。其他操作系统上的 Apache 不受此限。</p>

<h3 id="content_4_6">安装 php 5.1.6</h3>
<p>php的安装相对较简单。为了管理方便，我们将 php 与 Apache 放在一起。</p>
<p>首先将 php-5.1.6-Win32.zip 解压到 C:\Program Files\Apache Group\Apache2\php5 目录下。</p>
<p>php5中的 Apache2 模块为 <strong>php5apache2.dll</strong>（注意不是 php5apache.dll，那个是 Apache 1.3.x 的模块）。
修改 Apache2/conf 目录下的 httpd.conf 以加载 php5 模块。查找 <strong>LoadModule</strong>，
然后在其附近添加以下内容以加载php5模块，并设置 php.ini 的位置。</p>
<pre>LoadModule php5_module php5/php5apache2.dll
PHPIniDir php5</pre>
<p>然后查找<strong>AddType</strong>，在其附近添加以下内容，以增加 php 的类型。</p>
<pre>AddType application/x-httpd-php .php</pre>
<p>再查找<strong>DirectoryIndex</strong>命令，将其修改为以下内容，增加目录的默认文档 index.php。</p>
<pre>DirectoryIndex index.html index.html.var index.htm index.php</pre>
<p>然后进入 php5 目录，复制 <strong>php.ini-dist</strong> 文件为 <strong>php.ini</strong>。
然后修改 php.ini，查找 <strong>extension_dir</strong>，该变量指定了 php 功能模块的位置。
将其修改为以下的内容。</p>
<pre>extension_dir = &quot;./php5/ext&quot;</pre>
<p>注意，这个路径是从 Apache2 下开始算起，而不是从 Apache2/php5 下开始。</p>
<p>查找 session.save_path，这个变量指定session的保存位置。
将其前面的分号去掉，然后修改该行为以下内容：</p>
<pre>session.save_path = &quot;C:\Program Files\Apache Group\Apache2\tmp&quot;</pre>
<p>然后在 Apache2 目录下建立 <strong>tmp</strong> 目录，作为session的保存目录。</p>
<p>最后重新启动 Apache 服务器（方法参考 Apache 安装一节）。
为测试 php 是否安装成功，在文档目录 D:\wwwroot\htdocs 下建立 phpinfo.php 文件，内容如下：</p>
<pre>&lt;?php
  phpinfo();
?&gt;</pre>
<p>然后打开浏览器，访问 <a href="http://localhost/phpinfo.php">http://localhost/phpinfo.php</a> 。如果能看到 php 的信息页，
即表明php安装成功。</p>

<h4 id="content_4_7">PHP各个目录的作用</h4>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>dev</strong> - 开发用 php 静态库。</li>
<li><strong>ext</strong> - php扩展模块。</li>
<li><strong>extras</strong> - 相关文件。</li>
<li><strong>PEAR</strong> - 访问php模块网站 PEAR 的必要文件。</li></ul>
<p>另外，php目录下的部分文件功能如下。</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>php.exe</strong> - php的命令行解释程序，也可用作 CGI 解释器。</li>
<li><strong>php5apache2.dll</strong> - Apache 2.0的PHP模块。</li>
<li><strong>php5apache.dll</strong> - Apache 1.3的PHP模块。</li>
<li><strong>php5isapi.dll</strong> - Microsoft IIS的PHP模块。</li>
<li><strong>php5nsapi.dll</strong> - Netscape Server的PHP模块。</li>
<li><strong>php5ts.dll</strong> - PHP及其扩展模所需的库文件。</li></ul>

<h4 id="content_4_8">添加 mysql 支持</h4>
<p>php4之前的版本自带mysql，而在php5中，mysql不再默认支持。为了使php5支持mysql，
我们需要稍稍修改一下设置。</p>
<p>打开 php5/php.ini 文件，查找下面这一行，并将其前面的注释符号分号 ; 去掉。</p>
<pre>extension=php_mysql.dll</pre>
<p>但是这样还不能使用mysql功能，因为 php_mysql.dll 需要 php5 目录下的 php5ts.dll 和 libmysql.dll
（可以使用 Dependency Walker 打开 php_mysql.dll 查看），但是这两个 DLL 文件既不与 php_mysql.dll
位于同一目录下，也没有和可执行文件Apache.exe 位于同一目录下，因此 php_mysql.dll 找不到这两个DLL，
不能启动。解决方法就是将 php5ts.dll 和 libmysql.dll 复制到 Apache2/bin 下，然后重新启动 Apache2。</p>
<p>使用浏览器打开前面的 phpinfo.php 页面，可以看到页面输出的中部有 mysql 模块的配置，
说明 mysql 模块已经正常安装。</p>

<h3 id="content_4_9">安装 ActivePerl 5.8.8</h3>
<p>ActivePerl是Perl的一个Win32移植版。安装方法很简单，运行 ActivePerl-5.8.8.817-MSWin32-x86-257965.msi ，
即出现安装界面，一路 Next 即可。默认情况下安装到 C:\Perl 下。
注意在选择功能时务必选择 PPM 3.0，该程序能够很方便地安装各种Perl模块。</p>
<p>下一步需要在系统环境变量中增加 Perl 所在的位置。如果你在安装Perl时选择了
Add Perl to the PATH enviroment variable，则可以省略这一步。
否则打开<strong>控制面板-&gt;系统-&gt;高级-&gt;环境变量</strong>，修改系统变量中的 Path，
在其最前面增加以下内容：</p>
<pre>C:\Perl\bin;</pre>
<p>修改环境变量后，在安装 mod_perl 之前，最好能重新启动计算机。</p>

<h3 id="content_4_10">安装 mod_perl 2.0.2</h3>
<p>mod_perl是Apache的Perl扩展模块。它模拟了一个Perl的CGI执行环境，以便在Apache中执行Perl脚本。
但是mod_perl要比真正的Perl CGI的性能高上百倍。</p>
<p>Apache 2.0.x 系列对应的 mod_perl 第二版，mod_perl目前最新版本是 2.0.2。
可以使用Perl包管理工具 ppm 进行安装。</p>
<p>首先启动命令行提示符（<strong>开始-&gt;运行-&gt;输入cmd，OK</strong>），然后输入 <strong>ppm</strong>，
即可启动 ppm。如果启动失败，看看是否在安装 ActivePerl 的时候忘记添加 Path 环境变量了。
下面以 ppm&gt; 开头的行为输入的命令，其他行为输出结果。 # 符号后面为注释。</p>
<pre># 添加repository。repository为存放Perl模块的网站。
ppm&gt; repos add &quot;uwinnipeg Perl 5.8 repository&quot; http://theoryx5.uwinnipeg.ca/cgi-bin/ppmserver?urn:/PPMServer58
Repositories:
[1] ActiveState Package Repository
[2] uwinnipeg Perl 5.8 repository

# 搜索 mod_perl 模块
ppm&gt; search mod_perl
Searching in Active Repositories
  1. Apache-mod_perl_guide        [1.31] Apache-mod_perl_guide
  2. mod_perl                    [2.0.2] Embed a Perl interpreter in the Apache/2.0 HTTP server
  3. mod_perl-1            [1.29_01-dev] Embed a Perl interpreter in the Apache/1.3.27 HTTP server
  4. mod_perl-2.2            [2.0.3-dev] Embed a Perl interpreter in the Apache/2.2 HTTP server
  5. mod_perl-eapi-1       [1.29_01-dev] Embed a Perl interpreter in the Apache/1.3.27 HTTP server (with EAPI support)

# 搜索结果中第2项为我们要安装的 mod_perl 2.0.2，使用install命令进行安装
ppm&gt; install 2
Package 2:
====================
Install 'mod_perl' version 2.0.2 in ActivePerl 5.8.8.817.
====================
Downloaded 948125 bytes.
......

# 安装途中会询问 Apache 的模块安装位置，输入 C:\Program Files\Apache Group\Apache2\modules
Fetching http://theoryx5.uwinnipeg.ca/ppms/x86/mod_perl.so ...  done!
Where should mod_perl.so be placed? [D:/Apache2/modules] C:\Program Files\Apache Group\Apache2\modules   # 输入路径
......
Successfully installed mod_perl version 2.0.2 in ActivePerl 5.8.8.817.</pre>
<pre># 退出 ppm
ppm&gt; exit</pre>
<p>安装完毕之后，我们可以在 Apache2/modules 目录下发现刚刚安装的 mod_perl.so 文件。
下面我们要将此文件加载到 Apache 中。</p>
<p>打开 Apache2/conf 目录下的 httpd.conf文件，查找 <strong>LoadModule</strong>，
在其附近添加以下内容：</p>
<pre>
#LoadFile &quot;C:/Perl/bin/perl58.dll&quot;    # 如果你没有在环境变量path中添加 C:\Perl\bin 则需要这一行
LoadModule perl_module modules/mod_perl.so

# 添加mod_perl配置内容，并利用其处理 cgi-bin 下的脚本文件
&lt;Directory &quot;D:/wwwroot/cgi-bin&quot;&gt;
    SetHandler perl-script
    PerlResponseHandler ModPerl::Registry
    PerlOptions +ParseHeaders
    Options +ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
&lt;/Directory&gt;</pre>
<p>修改完成之后重新启动 Apache，mod_perl 即安装成功。
你可以在系统服务中看到 Apache2 服务的描述中多了 mod_perl/2.0.2 Perl/v5.8.8 的字样。</p>

<h4 id="content_4_11">测试CGI脚本的执行</h4>
<p>上面我们已经设置 cgi-bin 目录下的所有程序都使用 mod_perl 进行处理。这里我们执行一个脚本以确认其是否正常。</p>
<p>在 D:/wwwroot/cgi-bin 目录下建立 hello.cgi 文件，内容如下。
(实际上，该文件可以是任意扩展名，我们在Apache配置中用 Directory 指令指定 cgi-bin 目录，
因此 cgi-bin 下所有的文件都将被 mod_perl 处理。)</p>
<pre># hello.cgi
print &quot;Contennt-Type: text/html\n\n&quot;;
print &quot;Hello, world! This is a CGI.&quot;;</pre>
<p>保存之后在浏览器中输入 <a href="http://localhost/cgi-bin/hello.cgi">http://localhost/cgi-bin/hello.cgi</a> ，如能得到下面的结果则说明 mod_perl 工作正常。</p>
<pre>Hello, world! This is a CGI.</pre>
<p>如果显示 Internal Server Error，可参考 logs/httpd-error.log 文件中的错误信息。</p>

<h4 id="content_4_12">测试 mod_perl Apache Handler 的执行</h4>
<p>mod_perl 的另一种执行方法就是编写 Apache Handler。Apache Handler 是一个Perl模块，
在 Apache 启动时读入并常驻内存，用来处理Web请求。</p>
<p>在 D:/wwwroot 下建立 lib 目录，用于保存 Perl 模块。我们将建立 HelloWorld::Hello 模块，
内容为显示 “Hello, world”。为建立这个模块，我们需要进行以下的工作。</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>建立模块本身</li>
<li>将模块的位置放到 @INC 变量中以便 mod_perl 能找到我们建立的模块</li>
<li>修改 httpd.conf，设置使用该模块的位置</li></ul>
<p>在 lib 下建立 HelloWorld 目录，并在 HelloWorld 目录下建立 Hello.pm 文件，其内容如下。</p>
<pre>package HelloWorld::Hello;

use strict;
use warnings;
use Apache2::RequestRec ();
use Apache2::RequestIO ();
use Apache2::Const -compile =&gt; qw(OK);

sub handler {
    my $r = shift;
    $r-&gt;content_type('text/plain');
    print &quot;Hello, world! This is an Apache Handler.\n&quot;;
    return Apache2::Const::OK;
}
1;</pre>
<p>书写Perl模块时注意不要忘记最后的 1; ，如果没有的话 mod_perl 会出错。
（该文件的完整路径为 D:\wwwroot\lib\HelloWorld\Hello.pm，不要弄错了。）</p>
<p>然后我们需要将 HelloWorld::Hello 模块的位置告诉 mod_perl。
在 D:\wwwroot\lib 下建立 startup.pl 文件，内容如下：</p>
<pre>use lib qw(D:/wwwroot/lib);
1;</pre>
<p>然后修改 httpd.conf，加入下面的设置。</p>
<pre>PerlRequire &quot;D:/wwwroot/lib/startup.pl&quot;</pre>
<p>现在这个模块已经可以使用了。我们只需告诉 Apache 在什么情况下使用该模块。
修改 httpd.conf，加入下面的设置。</p>
<pre>&lt;Location /hello&gt;
    SetHandler perl-script
    PerlResponseHandler HelloWorld::Hello
&lt;/Location&gt;</pre>
<p>最后重新启动 Apache。在浏览器中打开 <a href="http://localhost/hello">http://localhost/hello</a>，应当能看到下面的文字：</p>
<pre>Hello, world! This is an Apache Handler.</pre>

<h3 id="content_4_13">安装 python 2.3.5</h3>
<p>双击 Python-2.3.5.exe 进行安装。默认的安装目录为 C:\Python23。</p>

<h4 id="content_4_14">为什么不使用 python 2.4 或 python 2.5 版本</h4>

<h3 id="content_4_15">安装 mod_python</h3>
<p>双击 mod_python-3.2.10.win32-py2.3-apache2.0.exe 进行安装。
安装程序会检测 Python 和 Apache 的安装路径，并将 mod_python.so 安装至 Apache2/modules 目录下。</p>
<p>打开 Apache2/conf/httpd.conf，查找 <strong>LoadModule</strong>，并在其附近添加以下内容。</p>
<pre>LoadModule python_module modules/mod_python.so</pre>
<p>最后重新启动 Apache2。</p>

<h3 id="content_4_16">安装 subversion</h3>
<p>subversion是一个优秀的版本控制系统，它能够完整地记录软件开发过程中源代码的变动，
并可以随时将源代码恢复到以前的任意版本。subversion的服务器可以单独使用，
也可以作为 Apache 的模块，通过 WebDAV 协议使用。</p>
<p>在 subversion 的<a href="http://subversion.tigris.org/project_packages.html">下载页面</a>上，
你会看到关于 Windows 版的说明，简单来讲就是 subversion 没有 Python 2.4 binding，
也就是说，使用 Python 2.4 不能对 subversion 进行编程，这也是我们不使用 Python 2.4
的一个原因。</p>
<p>将 svn-win32-1.3.2.zip 解压到 C:\svn 下。由于 svn 的 Apache2 模块
需要 C:\svn\bin 下的 intl3_svn.dll 和 libdb43.dll 文件，
所以要在环境变量 Path 中增加下面的内容，并重新启动计算机。</p>
<pre>C:\svn\bin;</pre>
<p>将 C:\svn\bin 下的 mod_dav_svn.so 文件复制到 Apache2/modules 目录下。</p>
<p>打开 Apache2/conf/httpd.conf 文件，
然后查找下面这一行，去掉其前面的注释符号 # 。</p>
<pre>LoadModule dav_module modules/mod_dav.so</pre>
<p>查找 <strong>LoadModule</strong>，并在其附近添加以下内容。</p>
<pre>LoadModule dav_svn_module modules/mod_dav_svn.so</pre>
<p>最后重新启动 Apache2。</p>
<!-- end Pukiwiki generated code-->
]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2006/08/31/apache-install-note/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Windows下subversion+python+apache结合的一些要点</title>
		<link>http://tech.idv2.com/2006/04/07/how-to-bind-apache-subversion-python-together/</link>
		<comments>http://tech.idv2.com/2006/04/07/how-to-bind-apache-subversion-python-together/#comments</comments>
		<pubDate>Fri, 07 Apr 2006 03:05:59 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[web]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://charlee.itbdns.com/tech/archive/91.html</guid>
		<description><![CDATA[<!-- begin Pukiwiki generated code--><p>发文日期：2006/4/7</p>
<p>在Windows环境下，由于这三个软件的编译环境不同，造成结合上的一些版本限制。使用的编译器有两种：MSVC和VC.NET。</p>
<p>Apache: 最新版本为 2.2.0(VC.NET)，前一版本为2.0.55(MSVC)。</p>
<p>Python: 2.3系列的最新版本为2.3.5(MSVC)；2.4系列的最新版本为2.4.2(VC.NET)。</p>
<p>subversion：最新版本为1.3.1(MSVC)。由于编译环境不同，该版本所附带的 mod_dav_svn.so 不支持Apache 2.2.0，仅支持 2.0.55；subversion的python binding也是不支持Python 2.4系列，仅支持Python 2.3系列。</p>
<p>因此，如果你仅仅是要绑定 Apache 和 Python，那么 Apache 2.0.x + Python 2.3.x 的组合或者是 Apache 2.2.x + Python 2.4.x 的组合都可以；但是如果还要绑定subversion，那么就只能选择 Apache 2.0.x + Python 2.3.x + subversion 1.3.1了。</p>
<p>估计subversion在近期内会推出使用 VC.NET 编译的版本。</p>
<!-- end Pukiwiki generated code-->
]]></description>
			<content:encoded><![CDATA[<!-- begin Pukiwiki generated code--><p>发文日期：2006/4/7</p>
<p>在Windows环境下，由于这三个软件的编译环境不同，造成结合上的一些版本限制。使用的编译器有两种：MSVC和VC.NET。</p>
<p>Apache: 最新版本为 2.2.0(VC.NET)，前一版本为2.0.55(MSVC)。</p>
<p>Python: 2.3系列的最新版本为2.3.5(MSVC)；2.4系列的最新版本为2.4.2(VC.NET)。</p>
<p>subversion：最新版本为1.3.1(MSVC)。由于编译环境不同，该版本所附带的 mod_dav_svn.so 不支持Apache 2.2.0，仅支持 2.0.55；subversion的python binding也是不支持Python 2.4系列，仅支持Python 2.3系列。</p>
<p>因此，如果你仅仅是要绑定 Apache 和 Python，那么 Apache 2.0.x + Python 2.3.x 的组合或者是 Apache 2.2.x + Python 2.4.x 的组合都可以；但是如果还要绑定subversion，那么就只能选择 Apache 2.0.x + Python 2.3.x + subversion 1.3.1了。</p>
<p>估计subversion在近期内会推出使用 VC.NET 编译的版本。</p>
<!-- end Pukiwiki generated code-->
]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2006/04/07/how-to-bind-apache-subversion-python-together/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
