0

CakePHPアプリケーションのグローバルな「ServerStatus」フラグを作成しようとしています。アイデアは、メンテナンスのためにオフライン/オンラインモードを切り替えて、データがサーバーにプッシュされているときにサイトがオフラインになるようにすることです。JavaScriptのトグルとリダイレクトを設定していますが、発生している問題はグローバル変数自体にあります。

私は2つのことを試しましたが、どちらもbootstrap.phpファイルにあります。

(1)Configure Classを使用して初期ステータスを書き込み、(2)$GLOBALS配列を使用して初期値を書き込みました。

後でトグルがアクティブになったときにステータスを代替(非初期)値に変更しようとすると、変更に失敗します。私が知る限り、これは、bootstrap.phpにグローバル変数を書き込むと、それが定数のように機能し、初期値が後で変更をオーバーライドすることを意味します。

トグルは、私のデフォルトのレイアウトdefault.ctpの小さなスクリプトです。

<script type="text/javascript">

        var charInputs = [];
        setInterval(clearInputBuffer(), 20000);

        function keyPressHandler(event)
        {
            var currChar = String.fromCharCode(event.charCode);
            charInputs.push(currChar);
            //alert(currChar + ' key pressed!');


            checkForKeyPhrases(charInputs);
        }

        function checkForKeyPhrases(chars)
        {
            // Get inputted chars as a sequence
            var seq = "";
            for (var i=0; i < chars.length; i++)
                seq += chars[i] + "";

            // Check for "Maintenance Mode"
            if (seq == ":maintenance")
            {
                alert("Maintenance mode... go!");

                <?php
                    if ($GLOBALS['ServerOnline'])
                    {
                        $GLOBALS['status'] = 'down';
                        $GLOBALS['ServerOnline'] = false;
                    }
                    else
                    {
                        $GLOBALS['status'] = 'up';
                        $GLOBALS['ServerOnline'] = true;
                    }
                ?>

                var temp = '<?php echo $GLOBALS['status']; ?>';
                alert('Current Server Status: ' + temp);

                clearInputBuffer();
            }
            else if (seq.indexOf('clear') > -1)
                clearInputBuffer();
        }

        function clearInputBuffer()
        {   charInputs = [];    }

    </script>

$GLOBALS['ServerOnline'] = true;bootstrap.phpで、私は;と書きます。しかし、アラートがポップアップすると、常にtrueの初期値が登録され、現在のステータスとして「ダウン」が表示されます。それは決して変わりません。

これを、初期化ブートストラップファイルにグローバルを書き込むと後の変更が上書きされることを意味するように解釈するのが正しい場合、CakePHPアプリの動的グローバルの初期値を書き込むのに最適な場所はどこですか?私が間違っている場合、誰かが私が欠けているものを見ますか?

よろしくお願いします!

4

1 に答える 1

0

はい、そうです。私が抱えている問題は、PHPとJavaScriptがどのように実行されるかを誤解していることだと思います。PHPは、ページがサーバー側に読み込まれる前に実行され、その後実行が完了します。これは、私のPHPグローバルが「実行ごと」の変数であることを意味します。JavaScriptがイベントをキャッチしてPHP変数を確認するまでに、JavaScriptはPHP変数を読み取っているだけで、設定されたコードはすでに実行されており、再度実行されることはありません。

基本的に、私はクライアント側とサーバー側のスクリプトを混同しています。

つまり、問題を解決する方法は2つあります。(1)スクリプト変数の代わりに、チェックして更新するファイルまたはデータベーステーブルという、ある種の永続ストレージを使用する方法、または(2)AJAXリクエストを作成する方法です。データをサーバーにPOSTして、サーバー側のコードをデータとともに実行します。

于 2013-03-27T00:25:39.910 に答える