8

xamppを使用してWindows XPでローカルにcakephpを使用してWebアプリケーションを開発しましたが、すべて正常に機能しました。今日、CentOS と Ubuntu サーバーにデプロイしましたが、どちらにも問題がありました。何が起こっているのかというと、自分の情報と一緒にタブ スペースが出力されているということです。を返すはずの ajax 呼び出しを行うとしましょうOK。返されるのは" 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

これは、レイアウトに関係なく、すべてのアクションで発生します。

誰かがこれを経験し、何が起こっているのか知っていますか? 私のファイルはすべて BOM なしの UTF-8 でエンコードされており、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このようなことをすると、echo "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 (存在する場合)

これらのファイルの 1 つに先頭または末尾の空白があります - 単純に見つけて削除してください。

自由に使えるツールを使用する

どのファイルが問題であるかを推測する必要はありません。どのファイルが原因であるかを教えてくれる非常に多くのツールがあります。そのようなツールの 1 つがデバッグ キット プラグインにあります。

-> 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 に答える