【问题标题】:PHP page displays on ubuntu, not on Windows 7PHP 页面显示在 ubuntu 上,而不是在 Windows 7 上
【发布时间】:2013-01-05 17:19:44
【问题描述】:

我们继承了一个在 Ubuntu 上运行良好的 PHP 页面,但将源代码转储到 Windows 7 系统的显示器上,该系统运行使用 PHP 5.4 的 XAMMP 或使用 PHP 5.3 的 WAMP。

转储发生的地方似乎是它试图解析“->”(对象属性)字符组合时。当我将其更改为“[]”以作为数组元素访问时,它会通过它,但随后会将源代码转储到出现在“=>”(映射)字符组合之后的显示器上。注释掉是行不通的,只有删除整行才能让它过去。

最后,当它只是打印带有“”符号的html时,也会导致屏幕转储。如果我用 html 实体替换这些字符,则源代码不会再转储,但程序不会显示菜单并且根本无法运行。请注意,我可以通过它的登录页面成功登录应用程序,尽管在用户名字段中显示“POST”和其他一些“”字符。

我尝试在整个应用程序上运行 unix2dos,但这没有任何效果。还尝试将其中一个违规页面的文本转换为 UTF-8,但仍然没有成功。

回答提出的一些问题:

工作的 ubuntu 版本是 PHP 版本 5.3.10-1ubuntu3.1

在 Ubuntu 中运行而不在 Windows 中运行的第一段代码是这样的:

public function __construct($gid)
{
    $this->id = $gid;
    return $this->retrieve();
}

代码转储到显示屏的起始位置:

id = $gid; return $this->retrieve(); }

是的,PHPInfo 确实有效,显示为 PHP 版本 5.3.13 的 WAMP 服务器

我尝试更改short-open-tag,但没有任何区别。

该产品是由一个外包团队为我们编写的,它似乎基于某种框架。但是我在 Google 上找不到任何对任何类名的引用,所以也许他们在内部编写了整个内容。

转到apache日志,实际错误发生在这一行:

$_SESSION['admin_gid'] = Membership::getGroup($rUser['id']);

错误信息在哪里:

未找到成员

Membership 是一个类,它稍后在同一个文件中声明,与在上面显示的点被转储到显示器上的文件相同,因此由于某种原因,PHP 解析器不理解它正在从该点读取 PHP 代码。

【问题讨论】:

  • 您能否发布在一个平台上运行而不在另一个平台上运行的最短代码?
  • 在 windows php.net/manual/en/ini.core.php#ini.short-open-tag 中似乎关闭了 short-open-tag 指令
  • 你能得到一个<?php phpinfo(); ?> 在 Win7 网络服务器上工作吗?
  • 如果您能准确地向我们展示您遇到的错误以及触发错误的代码,将会很有帮助。这不太可能是 Windows/Linux 转换问题,因为 PHP 被设计为可移植的。你运行的是什么软件?它是内部编写的代码还是第三方产品?您所做的更改(例如用[] 替换->)听起来不可信;在上下文中查看代码会很有用。此外,您还没有提到它在 Ubuntu 下运行的 PHP 版本(即使您已经告诉我们您在 Windows 中尝试过的 PHP 版本)。这也会有所帮助。
  • 发布了带有回复的编辑。谢谢。

标签: php wamp xampp


【解决方案1】:
I tried changing the short-open-tag but it made no difference.

在这种情况下,您可以编写一个小脚本并运行它,看看它是否有效。尝试短标签和以下方法。请记住,如果您弄乱了php.ini,您将不得不重新启动服务器。最好通过右键单击任务栏上的服务器图标来更改设置。这可能是由于php short tags。尝试启用和禁用并运行脚本。还要更改以下脚本,看看这对您更改的设置有何影响。

EG:

<?php
echo "hi";
// phpinfo(); <-- preferred if you can
?>

然后您可以查看您的服务器是否按预期工作。如果是 O/P hi 你可以试试你的大代码看看。

顺便说一句,您提供的代码似乎没有错误。

【讨论】:

  • 这最初是在 cmets 中建议的,但让它工作的方法是通过右键单击服务器来设置标志。
【解决方案2】:

嗯,很有趣。

如果这是一个大型应用程序,那么您可能需要检查所有包含的文件。可能有很多问题。

尝试执行以下步骤

  1. 设置error_reporting(E_ALL);
  2. 尝试使用debug_backtrace http://php.net/manual/en/function.debug-backtrace.php
  3. 检查输出缓冲状态。是开还是关

另一方面,你有没有把整个项目从linux复制到windows?可能有些文件在项目文件夹之外,而在 Windows 中不存在?我知道很多人确实制造了这样的漏洞,因此可以联系他们以获得“支持”:)

【讨论】:

    【解决方案3】:

    PHP 对类命名不区分大小写。你可以正常做

    $membership = new membership();
    

    即使班级被命名为“会员”,反之亦然。尝试更改类名,可能类文件名在操作系统上区分大小写。

    【讨论】:

      【解决方案4】:

      这真的很奇怪..虽然你可以检查会员类是否已加载或未使用函数:

      array get_declared_classes ( void )
      
      
      <?php
      print_r(get_declared_classes());
      ?>
      

      它将返回一个包含已定义类名称的数组。

      参考: http://php.net/manual/en/function.get-declared-classes.php

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-29
        • 1970-01-01
        • 2018-05-26
        • 2020-05-30
        • 1970-01-01
        • 2015-11-24
        • 1970-01-01
        相关资源
        最近更新 更多