注意:
这个问题不是关于在PHP中使用短标签。问题不是短标记本身,而是include
函数似乎忽略此Plesk服务器上短标记的禁用状态的方式。
我有一个新网站需要处理和修复。该网站是由另一个人建造的,并且是多年前使用非最佳实践建造的。该网站最近被转移到Plesk服务器。
我对Plesk不熟悉,因此一直在学习它的惯例。
Plesk PHP设置的核心设置是禁用短标签(<? ... ?>
)。我正在处理的网站广泛使用短标签(以及完整的<?php
标签)。
问题是PHP include
函数仍在执行和加载的短标记内的代码,其内容仍然输出到浏览器源HTML,但短标记中的任何其他内容都不会执行。
include
的错误吗?short_open_tag: Off
HTML 页面(index.php
,各种页面):
<?
session_start();
include "inc/dbi.php";
if(isset($_REQUEST['id'])){
$id = substr($_REQUEST['id'],0,6);
}
else{
header("Location: index.php?msg=No image specified");
exit;
}
$qry = mysqli_query($MySQlink,"...");
$row = mysqli_fetch_array($qry);
$docwidth = floor($row['width']*4.26);
$docwidth /= 100;
$docheight = floor($row['height']*04.26);
$docheight /= 100;
$descr = nl2br($descr);
?>
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
...
...
inc / dbi.php 页面:
<?php
$user = "some_user";
$pass = "some_pass";
$db = "some_db";
$MySQlink = mysqli_connect( "localhost" , $user, $pass, $db );
if ( ! $MySQlink ) { mysqli_close($MySQlink); }
$now = date('Y-m-d H:i:s');
$today = date('Y-m-d ');
<?
session_start();
include "inc/dbi.php";
if(isset($_REQUEST['id'])){
$id = substr($_REQUEST['id'],0,6);
}
else{
header("Location: index.php?msg=No image specified");
exit;
}
$qry = mysqli_query($MySQlink,"...");
$row = mysqli_fetch_array($qry);
$docwidth = floor($row['width']*4.26);
$docwidth /= 100;
$docheight = floor($row['height']*04.26);
$docheight /= 100;
$descr = nl2br($descr);
?>
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<?
session_start();
$user = "some_user";
$pass = "some_pass";
$db = "some_db";
$MySQlink = mysqli_connect( "localhost" , $user, $pass, $db );
if ( ! $MySQlink ) { mysqli_close($MySQlink); }
$now = date('Y-m-d H:i:s');
$today = date('Y-m-d ');
if(isset($_REQUEST['id'])){
$id = substr($_REQUEST['id'],0,6);
}
else{
header("Location: index.php?msg=No image specified");
exit;
}
$qry = mysqli_query($MySQlink,"...");
$row = mysqli_fetch_array($qry);
$docwidth = floor($row['width']*4.26);
$docwidth /= 100;
$docheight = floor($row['height']*04.26);
$docheight /= 100;
$descr = nl2br($descr);
?>
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
我很清楚上述代码的缺失,但这不是我的工作,我的工作就是解决这些缺点并使其更好。
但是,我对include函数的行为感到困惑,并且已经阅读了various PHP错误报告以及阅读include
和{{}的手册{3}}。没有一个提到这个问题。
我主要担心的是,在一段时间内,数据库连接细节会输出到HTML(显然已经改变了)。
答案 0 :(得分:2)
在编译阶段但未在运行时读取包含的文件。
由于您的PHP解释器不会解释短标签中的代码并将其直接转储到浏览器,因此将include
语句替换为所包含文件的内容并无罪。
没有php.ini
设置可以说服它表现得像这样。
我可以想象其他原因:
include/require
语句替换所包含文件的内容; 此类处理的目的是通过最小化其磁盘访问来优化脚本。
答案 1 :(得分:0)
Plesk的帮助,呃,无益,响应者没有立即回答我的问题。
总的来说,他们看起来很谨慎,不愿意详细说明他们的PHP处理过程。他们只是说他们通过标准的Plesk安全扩展来运行所有PHP脚本。
这并没有告诉我很多,但Plesk响应者确实提出重新启用帐户上的短标签(我没有帐户的管理员权限,只有他的帐户有条目或转销商级访问权限不能自己编辑核心帐户php.ini)。
重新启用短标签显然解决了向浏览器输出PHP详细信息的问题。
我认为Plesk正在做类似as described by axiac的事情,所以我认为他/她的回答是正确的;虽然在这种情况下它没有解决问题,但它(很可能)似乎确定了它。