8

我已经在带有 xampp 的 Windows XP 中本地开发了一个带有 cakephp 的 Web 应用程序,并且一切正常。今天我将它部署到 CentOS 和 Ubuntu 服务器上,但我都遇到了问题。发生的事情是 Tab 空间与我的信息一起输出。假设我进行了一个应该返回的 ajax 调用,更准确地说,OK返回的是" OK"(0x09)OK

我真的不知道这个标签是从哪里来的。我已将我的代码减少到最大,但我仍然得到它。

控制器

public function sendcomment() {
        $this->layout = 'ajax';
        $this->set('ret', 'OK');
    }

看法

<?php echo $ret; ?>

即使我不直接在布局上使用视图文件和输出信息,选项卡仍然存在:

控制器

public function sendcomment() {
        $this->layout = 'testlayout';
    }

测试布局.ctp

OK

无论布局是什么,所有操作都会发生这种情况。

有没有人经历过这个并知道可能发生了什么?我所有的文件都以 UTF-8 编码,没有 BOM,它们在 Windows 上通过 XAMPP 工作得很好。

- 编辑:

好吧,有人说这是配置问题,我真的不知道。然而,为了找到“标签”的来源,我开始在核心文件上添加回声并不断前进,直到最终找到标签所在的位置。从 cake webroot 的 index.php 开始,如果我放在方法echo 'a'之前dispatch(),我的输出是a(0x09)OK. 所以标签确实来自蛋糕。

现在问题来了,看看几次测试的结果,我终于卡住了,这让我一无所获。

现在我在(CakeRoot)/lib/Cake/Routing/Dispatcher.php。这里我们有以下方法:

protected function _loadController($request) {
    $pluginName = $pluginPath = $controller = null;
    if (!empty($request->params['plugin'])) {
        $pluginName = $controller = Inflector::camelize($request->params['plugin']);
        $pluginPath = $pluginName . '.';
    }
    if (!empty($request->params['controller'])) {
        $controller = Inflector::camelize($request->params['controller']);
    }
    if ($pluginPath . $controller) {
        $class = $controller . 'Controller';
        App::uses('AppController', 'Controller');
        App::uses($pluginName . 'AppController', $pluginPath . 'Controller');
        App::uses($class, $pluginPath . 'Controller');
        if (class_exists($class)) {
            return $class;
        }
    }
    return false;
}

我正是在这一部分:

    App::uses($class, $pluginPath . 'Controller');
    if (class_exists($class)) {
        return $class;
    }

现在这里是测试,如果我echo在 if 之前放一个正确的,像这样:

    App::uses($class, $pluginPath . 'Controller');
    echo 'a';
    if (class_exists($class)) {
        return $class;
    }

我的输出将是a(0x09)OK. 但是,如果我将我的回声放在 if 中,如下所示:

    App::uses($class, $pluginPath . 'Controller');
    if (class_exists($class)) {
        echo 'a';
        return $class;
    }

我的输出将是(0x09)aOK。我唯一想到的就是class_exists()与标签相呼应。但这没有任何意义。出于测试目的,我做了这个:

    App::uses($class, $pluginPath . 'Controller');
    if (TRUE) {
        return $class;
    }

仍然在输出选项卡。更糟糕的是,如果我这样做if == TRUE,无论回声“a”是在 if 之前还是在 if 内部,输出都将始终为a(0x09)OK.

这里发生了什么?

4

1 回答 1

1

所以标签确实来自蛋糕。

这是一个错误的结论。

你几乎拥有它

解释你的代码:

App::uses($class, $pluginPath . 'Controller');
echo "before";
if (class_exists($class)) {
    echo 'after';
    return $class;
}

输出:before(0x09)after

这里没有什么大奥秘。以这种方式使用,class_exists将自动加载类 - 即包括它们,以及任何直接的类依赖项(因为它们也将调用类加载)。因此,它可以来自一个非常短的列表:

  • 控制器$class/Controller.php
  • Plugin/Foo/Controller/FooAppController.php(如果是插件控制器)
  • Controller/AppController.php(如果存在)

这些文件之一具有前导或尾随空格 - 只需找到它并删除它。

使用您可以使用的工具

您无需猜测问题是什么文件,有很多很多工具会告诉您哪个文件是罪魁祸首。一个这样的工具是在调试工具包插件中,例如:

-> Console/cake DebugKit.whitespace

Welcome to CakePHP v2.3.0-RC2 Console
---------------------------------------------------------------
App : app
Path: /path/to/app/
---------------------------------------------------------------
Checking *.php in /path/to/app/
!!!contains trailing whitespaces: /app/Controller/AppController.php
于 2013-03-13T19:50:27.620 回答