mod_php 与 mod_python

4 投票
6 回答
3057 浏览
提问于 2025-04-15 11:38

为什么mod_python是面向对象的,而mod_php不是?

举个例子:我们访问www.example.com/dir1/dir2

如果你使用mod_python,Apache会打开www/dir1.py这个文件,并调用里面的dir2方法;但如果你使用php模块,Apache会打开www/dir1/dir2/index.php这个文件。

6 个回答

4

我觉得你对HTTP的工作原理有一些误解。HTTP标准并没有要求你必须有某个特定的文件作为资源。其实,这只是mod_php的工作方式,对于给定的路径,这个路径会被转换成服务器硬盘上的一个php文件,然后由编译器来解释。

mod_python模块则要通用得多,它允许你将任何资源映射到某个python对象的调用。恰好有一些现成的配置可以使用,这样可以让你更容易上手。在大多数情况下,URL的分发是由你的框架来管理的,具体是怎么工作的则取决于框架的开发者。

由于mod_python模块的通用性,你还可以访问一些在mod_php模块中没有的Apache功能,比如你可以编写自己的认证处理程序,这不仅可以应用于你的python网页应用,还可以应用于你Apache中的其他应用。

4

因为mod_python把网址处理成了一种“像远程过程调用(RPC)”的方式。你在PHP中也可以做到这一点。我以前都是手动实现的,不过我相信有现成的pear模块可以用来做这个。

需要注意的是,mod_python的这种做法并不一定是“最好”的。最终还是看你想给你的应用设计成什么样,以及它对用户的表现。就我所见,mod_python的方法是把每个网址都对应一个函数,就像把模块结构映射成一个网址树。这种做法从技术上来说并不是特别理想,因为你使用的技术(mod_python)和你应用的网址布局之间有很强的关联。

至于为什么会这样,其实没有特别的理由。有些人喜欢一种食物,有些人则喜欢另一种。设计在某些情况下是一种个人口味和艺术选择的问题,而不仅仅是技术限制。

8

我们来聊聊mod_python和mod_php。

首先,Python语言并不是专门为了提供网页服务而设计的,所以mod_python需要做一些额外的工作。

而PHP语言是专门为网页服务而设计的,因此mod_php只需要启动一个指定的PHP模块就可以了。

在mod_python的情况下(和mod_fastcgi或mod_wsgi不同),mod_python的设计者认为调用Python的最好方式是通过一个模块中定义的对象的方法。希望这个对象的方法能把网页的头信息和内容写到标准输出中。

而在mod_wsgi的情况下,设计者认为调用Python的最好方式是通过模块中的一个函数(或者可调用对象)。希望这个函数能利用提供的对象来创建头信息,并返回一个包含网页内容的字符串列表。

至于mod_php,它们直接调用模块,因为PHP模块就是为了提供网页服务而设计的。程序运行后,结果就是一页内容,通常是HTML格式。

mod_php、mod_python和mod_wsgi之所以各自有不同的工作方式,是因为它们的设计理念不同。它们是由不同的人编写的,定义了不同的网页生成方式。

PHP页面可以是面向对象的,而mod_wsgi的函数可以是可调用对象,也可以是简单的函数。这些都是设计选择。

mod_python要求使用类,这是mod_python设计者做出的一个设计选择。

至于“为什么”这样设计,其实并没有太大意义。之所以这样,是因为有人决定要这样设计。

撰写回答