将php5_模块添加到apache服务器的复杂性

将php5_模块添加到apache服务器的复杂性,php,apache,Php,Apache,关于服务器上的php文件和perl文件(或任何其他文件)之间的差异,我有很多问题。但我要试着从简单开始,然后开始工作 首先,我在我的mac上安装了OSX优胜美地。Apache2预装了此操作系统。我在httpd.conf中没有做任何更改,我的文件位于此处: DocumentRoot "/Library/WebServer/Documents" 我有3个文件welcome.pl、welcome.php和welcome.txt,它们的内容都相同 $name="Matt"; $email="foo@b

关于服务器上的php文件和perl文件(或任何其他文件)之间的差异,我有很多问题。但我要试着从简单开始,然后开始工作

首先,我在我的mac上安装了OSX优胜美地。Apache2预装了此操作系统。我在httpd.conf中没有做任何更改,我的文件位于此处:

DocumentRoot "/Library/WebServer/Documents"
我有3个文件welcome.pl、welcome.php和welcome.txt,它们的内容都相同

$name="Matt";
$email="foo@bar.com";

print "<!DOCTYPE html>\n";
print "<html>\n<body>\n\nWelcome " . $name . "<br>\nYour email address is: " . $email . "\n\n</body>\n</html>";

由于perl脚本不使用@符号,唯一的区别是它们的扩展名

如果我启动apache服务器并打开三个浏览器窗口并转到各自的页面,则它们看起来都一样:

(复制于Safari和Chrome)

同样,如果我打开三个浏览器窗口并转到它们各自的文件系统资源,则它们看起来都一样:

(复制于Safari和Chrome)

但是,如果我随后通过取消注释来启用php:

#LoadModule php5_module libexec/apache2/libphp5.so
在我的httpd.conf文件中,重新启动服务器并打开三个浏览器窗口,转到各自的页面,然后welcome.php更改为:

(复制于Safari和Chrome)

但是,如果我再次访问它们各自的文件系统资源,那么它们看起来都一样。为什么服务器对php文件进行不同的解析

现在让我们将welcome.php更改为

<?php
$name="Matt";
$email="foo@bar.com";

print "<!DOCTYPE html>\n";
print "<html>\n<body>\n\nWelcome " . $name . "<br>\nYour email address is: " . $email . "\n\n</body>\n</html>";
?>
在模块部分,更换

Options FollowSymLinks Multiviews
与:

在“Library/WebServer/Documents”目录指令中添加

AddHandler cgi-script .cgi .pl
在“Library/WebServer/Documents”目录指令中,如果重新启动服务器,则会得到:

(复制于Safari和Chrome)

但现在如果我替换

AddHandler cgi-script .cgi .pl

AddHandler cgi-script .cgi .pl php
<?php
$name="Matt";
$email="foo@bar.com";

print "<!DOCTYPE html>\n";
print "<html>\n<body>\n\nWelcome " . $name . "<br>\nYour email address is: " . $email . "\n\n</body>\n</html>";
?>
重新启动服务器并转到localhost/welcome.php

然后我得到一个内部服务器错误(在Safari和Chrome中复制)

但是如果我替换

AddHandler cgi-script .cgi .pl

AddHandler cgi-script .cgi .pl php
<?php
$name="Matt";
$email="foo@bar.com";

print "<!DOCTYPE html>\n";
print "<html>\n<body>\n\nWelcome " . $name . "<br>\nYour email address is: " . $email . "\n\n</body>\n</html>";
?>

#/usr/bin/php
然后又好了(用Safari和Chrome复制)。我想我的观点是,在服务器上似乎有两种类型的php编译。一个用于编译带有php扩展名的文本文件,另一个用于运行php脚本并将输出返回给客户端


我想知道这是为什么。区别仅仅在于服务器吗?我是否可以在命令行中将一个php文件作为输入传递给php编译器并获得类似的结果,或者服务器正在执行一些我没有看到的中间工作?

在我看来,您已经将php安装为CGI和Apache模块(
mod_php5


在这两种情况下,您都需要PHP open标记
,在我看来,您已经将PHP安装为CGI和Apache模块(
mod_php5


在这两种情况下,您都需要PHP open标记
PHP不使用CGI。您需要启用另一个实际提到php5_模块的loadModule。您是对的,cgi也存在,但实际上mod_php5会工作得更好。PHP不使用cgi。您需要启用另一个实际提到php5_模块的loadModule。cgi也存在,这是对的,但实际上mod_php5会更好地工作。但是perl文件不像php文件那样是“模板”。如果您查看上面的内容,就会发现只要cgi模块被注释为welcome.pl,它就会将文本“replica”返回给客户端。而服务器评估php模板标记,然后发送文件。但是,这与编译php代码并返回结果不同。明天我举个例子。我的问题是“模板评估”和实际运行php代码并将其返回给客户端之间的区别是什么?听起来你是说perl模块控制前者,cgi模块控制后者。我会照你说的做,明天添加mod_perl,看看它能做什么。但是perl文件不像php文件那样是“模板”。如果您查看上面的内容,就会发现只要cgi模块被注释为welcome.pl,它就会将文本“replica”返回给客户端。而服务器评估php模板标记,然后发送文件。但是,这与编译php代码并返回结果不同。明天我举个例子。我的问题是“模板评估”和实际运行php代码并将其返回给客户端之间的区别是什么?听起来你是说perl模块控制前者,cgi模块控制后者。我会照你说的做,明天添加mod_perl,看看它能做什么。
AddHandler cgi-script .cgi .pl
AddHandler cgi-script .cgi .pl

AddHandler cgi-script .cgi .pl php
<?php
$name="Matt";
$email="foo@bar.com";

print "<!DOCTYPE html>\n";
print "<html>\n<body>\n\nWelcome " . $name . "<br>\nYour email address is: " . $email . "\n\n</body>\n</html>";
?>
#!/usr/bin/php
<?php
print "Content-type: text/html\n\n";
$name="Matt";
$email="foo@bar.com";

print "<!DOCTYPE html>\n";
print "<html>\n<body>\n\nWelcome " . $name . "<br>\nYour email address is: " . $email . "\n\n</body>\n</html>";
?>