我在Windows XP中使用xampp在本地开发了一个带有cakephp的Web应用程序,一切正常。今天我把它部署到了CentOS和Ubuntu服务器上,两者都有问题。
发生的事情是Tab空间与我的信息一起被输出。假设我做了一个应该返回OK
的ajax调用,返回的是" OK"
,更确切地说是(0x09)OK
我真的不知道这个标签的来源。 我已将代码减少到最大值,但仍然可以得到它。
控制器
public function sendcomment() {
$this->layout = 'ajax';
$this->set('ret', 'OK');
}
查看
<?php echo $ret; ?>
即使我没有直接在布局上使用视图文件和输出信息,选项卡仍然存在:
控制器
public function sendcomment() {
$this->layout = 'testlayout';
}
testlayout.ctp
OK
无论布局如何,所有操作都会发生这种情况。
是否有人经历过此事并知道可能发生的事情? 我的所有文件都是用UTF-8编码的,没有BOM,它们在Windows上运行得非常好。
- 编辑:
好吧,有人说这是配置问题,我真的不知道。
然而,试图找到来自“标签”的位置,我开始在核心文件上放置回声并前进和前进,直到我最终到达标签所在的位置。
从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;
}
现在这里是测试,如果我在if之前放置一个echo
,就像这样:
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之前或之前,输出总是a(0x09)OK
。
这里发生了什么?
答案 0 :(得分:1)
所以标签确实来自蛋糕。
这是一个错误的结论。
解释你的代码:
App::uses($class, $pluginPath . 'Controller');
echo "before";
if (class_exists($class)) {
echo 'after';
return $class;
}
输出:before(0x09)after
这里没有什么大不了的。以这种方式使用,class_exists将自动加载类 - 即包含它们,以及任何直接的类依赖项(因为它们也将调用类加载)。因此,它可以来自一个非常短的地方列表:
$class
Controller.php这样的其中一个文件有前导空格或尾随空格 - 只需查找并删除即可。
您不需要猜测问题是什么文件,有很多工具可以告诉您哪个文件是罪魁祸首。一个这样的工具在debug kit plugin中,例如:
-> 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