PHP代码未被执行,但该代码在浏览器源代码中显示。

417

我正在尝试在一个项目中执行一些PHP代码(使用Dreamweaver),但是代码并没有运行。

当我查看源代码时,PHP代码出现为HTML标记(我可以在源代码中看到)。Apache正常运行(我正在使用XAMPP),PHP页面能够正常打开,但PHP代码未被执行。

有人对发生的情况有什么建议吗?

注意:文件已命名为filename.php

编辑: 代码..:

<?
include_once("/code/configs.php");
?>

打印


58
你是否在使用 <? 短标签而不是 <?php - Dan Grossman
你从phpinfo()得到任何结果了吗?(参见示例1,http://php.net/manual/en/function.phpinfo.php)如果没有,你可能需要重新配置apache。 - amccormack
42
永远不要使用短标签(<?)。它们已经被弃用,在很多地方并不起作用,而且完全没有必要。为了节省三个按键而允许您的代码有可能在可能运行的一半服务器上失败,这并不是一个合理的理由。 - mopsyd
8
我知道短标签不是短输出标签,这就是为什么我在注释中指定了我所说的是哪种标签。当时写作时,短标签被标记为 php 6 发布的弃用内容,但自那以后似乎已经改变了。问题仍然存在,很多服务器将其禁用,这使得您的代码的可移植性显著降低。这并不适用于短输出标签 ( <?= ),无论服务器设置如何,它都应该可以在 php 5.4+ 上正常运行。 - mopsyd
同时查看 tail -f -n 50 /var/log/apache2/error.log 帮助我找到了问题所在。 - aderchox
36个回答

505

听起来你的配置出了一些问题,这里有几个你可以检查的事项:

  1. 确保PHP已经正确安装并运行。这听起来很傻,但你永远不知道。检查的简单方法是在命令行中运行php -v,看它是否返回版本信息或任何错误。

  2. 确保Apache的httpd.conf文件中列出并取消注释PHP模块。这应该是文件中类似于LoadModule php5_module "c:/php/php5apache2_2.dll"的内容。查找LoadModule php,确保其前面没有注释(;)。

  3. 确保Apache的httpd.conf文件中有PHP MIME类型。这应该是类似于AddType application/x-httpd-php .php的内容。这告诉Apache将.php文件作为PHP运行。查找AddType,然后确保有一个PHP条目,并且未被注释。

  4. 确保你的文件具有.php扩展名,或者在第3点中指定的MIME定义中的任何扩展名,否则它将不会被执行为PHP。

  5. 确保PHP文件中没有使用短标签<?),这些标签默认情况下并非所有服务器都启用,使用它们是不鼓励的。使用<?php代替(或者在php.ini中启用短标签,使用short_open_tag=On如果你有依赖它们的代码)。

  6. 确保你通过像http://localhost/file.php这样的URL访问你的文件,而不是通过本地文件访问file://localhost/www/file.php

最后,查看PHP手册以获取更多设置提示。


21
不知道为什么,但 PHP 5.3.15 的安装程序没有添加 AddType application/x-httpd-php .php 这一���。非常感谢! - MatuDuke
8
@shmeeps: 你在哪里看到短标签被弃用了?我做了一些搜索,只能找到建议不使用它们的内容,没有关于弃用的信息。当然,对于要分发的应用程序来说,在主机服务器没有启用它们的情况下最好使用<?php,但是对于您完全控制的服务器上运行的应用程序,我认为没有理由不使用它们。请注意,我的任务是翻译,不包括解释或返回其他内容。 - ClarkeyBoy
3
第六点对我有用。本地访问不使用Apache服务器。 - KawaiKx
9
第2点对我很有用,安全的方式是执行以下命令:apt-get purge apache2; apt-get install apache2 libapache-mod-php5。这将卸载旧版本的Apache2并安装新版本的Apache2和PHP5模块。 - ulkas
3
尝试上传一个扩展名为.php的文件,其中包含<?php echo("Success"); ?>内容,并查看通过Web浏览器访问该文件是否会显示“Success”,而不是相关的PHP代码。 - shmeeps
显示剩余16条评论

102

PHP7:

sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php7.0-fpm
sudo service apache2 restart

42
这段代码可能解决了问题,但如果能解释一下如何为什么解决这个问题,会非常有帮助,以提高您的文章质量。请记住,您正在回答未来的读者,而不仅仅是当前提问的人!请 [编辑] 您的回答并添加解释,同时给出适用的限制和假设。 - Toby Speight
7
这个答案与Linux有关,而楼主显然在使用Windows。 - Raymond Nijland
6
@RaymondNijland 确实如此,但这是标准做法,我在查找问题并经历了一个多小时的疑难排除后找到了这个问题并解决了它。 - Goose
1
如何以及为什么:当PHP7在制作脚本中没有配置默认的fast-CGI服务时,这种情况会发生。sudo a2enmod proxy_fcgi setenvif 会创建三个新模块 /mods-available/proxy.conf proxy_fcgi.load proxy.load 同样, sudo a2enconf php7.0-fpm 会创建一个配置文件 /conf-available/php7.0-fpm.conf 。完成这些步骤后,Apache2就可以将PHP7模块作为fast-CGI服务运行。 - Talvi Watia
应该是最佳答案! - Richard Aguirre
显示剩余3条评论

39

注意PHP 7用户,请将以下内容添加到您的httpd.conf文件中:

# PHP 7 specific configuration
<IfModule php7_module>
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps
    <IfModule dir_module>
        DirectoryIndex index.html index.php
    </IfModule>
</IfModule>

6
为帮助其他人解决此问题,需要提醒一下:httpd.conf 文件位于 /etc/apache2/httpd.conf。如果使用的是 Ubuntu 系统,则需要修改同一目录下的 apache2.conf 文件才能支持 PHP7。 - Ahmed Sagarwala

39

我在Ubuntu上运行Apache,我的问题是/etc/apache2/mods-available/php5.conf文件缺少以下内容:

<FilesMatch ".+\.ph(p[345]?|t|tml)$">
    SetHandler application/x-httpd-php
</FilesMatch>

我把它添加回去后,PHP能够正确解析PHP文件。

24

你刚刚直接在浏览器中打开了你的php文件,而应该使用本地主机URL打开它。如果你直接从目录中打开文件,无论如何都不会执行php代码。

使用:http://localhost/index.php或者http:127.0.0.1/index.php

启用php短代码。在你的情况下,你正在使用<?,这是php短代码的写法,等同于<?php。PHP短代码默认是禁用的。

如果你使用的是Ubuntu,请同时使用sudo apt-get install php5 libapache2-mod-php5 php5-mcrypt这个命令。


2
当我只是包含一个文件时,为什么需要mcrypt?你应该注意到这个问题很旧了,短标签问题已经被提到了16次,还在我的问题的顶部评论中提到。 - Gui
1
我只是分享我的解决方案,我之前也遇到了同样的错误,在执行了这个mcrypt命令之后,我的问题得到了解决。你也可以试试。 - Hasan Baig
默认情况下,PHP短代码是启用的。在PHP 5.6中,short_open_tag=On(默认值=ON)。 - zond
这是我的问题,我的virtualmin/apache配置是针对127.0.0.2的,但我在浏览器中输入了我的外部IP地址,我只需更新我的v/a配置,现在它正常工作了。 - Hayden Thring
我只是缺少了 libapache2-mod-php7.3 模块。 - dxvargas
在将php.ini中的short_open_tag=On更改之后,我的代码在Ubuntu上的Xampp上开始运行。太好了... - Ashish Kumar Mondal

23

我发现另一个导致这个问题的原因并已解决。我不小心将脚本保存为UTF-16编码。似乎PHP5默认无法识别16位编码中的<?php标记。


19

我发布这个答案是因为我的Virtualmin/Webmin管理界面决定禁用我的PHP引擎...花了我一段时间才找到解决方案,所以我想与大家分享:

另外,请务必检查与这个特定主机或虚拟主机相关的网站配置文件中是否有任何php_admin_value将PHP关闭的内容,例如:

php_admin_value engine Off

如果有疑问,就加上注释...

# php_admin_value engine Off

然后重新启动您的 Web 服务器。


1
这些配置设置确切在哪里? - cronoklee
2
在httpd.conf的vHost设置中。对于现有的主机,您需要在Webmin中编辑apache配置。对于将来的主机,请转到Virtualmin>服务器模板> Apache网站。无论哪种方式,这都不如fastcgi安全- virtualmin的默认设置。因此,正确的方法是排除fcgi无法正常工作的原因,例如可能是由于文件权限引起的。 - Sheepy
如果您使用的是没有httpd.conf的Apache版本,请查看/etc/apache2/mods-enabled/php7.confphp5.conf - Sam Malayek
当您对某个配置设置的位置存在疑问时,您可以始终使用grep来查找您要查找的内容,例如在这种情况下,输入以下命令:sudo grep php_admin_value /etc/* -R - Henry van Megen

9

我再次遇到了这个问题,服务器下载html文件而不是处理它们。我有一段时间没有在电脑上使用apache web服务器,并且期间Ubuntu更新了两个更高版本,从最初安装的LTS版本。现在情况是这样的:

$ cat /etc/issue
Ubuntu 16.04 LTS

那么,php代码可以像下面这样正常工作:

$ sudo apt-get install lamp-server^
$ sudo a2enmod php7.0
$ sudo service apache2 restart 

现在,Web服务器正在解析PHP。也许现在需要更新一些网站,因为现在运行的是PHP7.0,而以前运行的是PHP5。嗯,好吧。


8
我知道这听起来很傻,但很少会发生这种情况。
请检查您是否尝试从中执行php。
**http://localhost/info.php**

并非来自

file:///var/www/info.php

PS:您可以注意到,如果从shell中写入

php info.php 

IT通过代码(也就是PHP函数)提供答案。


1
PHP在命令行中运行良好(已经检查过)。但是,当我使用URL访问文件时,它会显示PHP代码。 - Muaaz Khalid

6

如果我们在同一页面上,请执行以下操作:

sudo apt-get install php -y sudo apt-get install php-{bcmath,bz2,intl,gd,mbstring,mysql,zip,fpm} -y

要在Apache2中启用PHP 7.2 FPM,请执行以下操作:

a2enmod proxy_fcgi setenvif

a2enconf php7.2-fpm

更新2:Apache下载.php文件而不是进行渲染

之后,我遇到了上述问题。类似的问题有这个

我不知道为什么,但它只发生在我的/var/www/html/根目录下的.php文件中。子目录的一切都正常。(例如wordpress和phpmyadmin正常工作)

因此,这是我的解决方案。我决定启用php模块。所以我运行了这个命令:

a2enmod php7.2

但是我得到了这些错误:

考虑到php7.2的依赖关系mpm_prefork: 考虑到mpm_prefork的冲突mpm_event: 错误:模块mpm_event已启用-由于冲突无法继续。它需要首先被禁用! 考虑到mpm_prefork的冲突mpm_worker: 错误:无法为php7.2启用依赖关系mpm_prefork,中止

因此,我决定通过运行以下命令来禁用mpm:

sudo a2dismod mpm_prefork
sudo a2dismod mpm_worker
sudo a2dismod mpm_event

然后重新启动Apache:

systemctl restart apache2

接着启用PHP7.2(我的安装版本):

sudo a2enmod php7.2

现在一切都正常运作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接