2

$.ajax (jQuery) が PHP Singleton でうまく動作しないようです。

次のように定義された単純なクラスがあります。

class MySingleton
{
    protected static $instance = null;
    private $array;
    protected function __construct()
    {
       ...
       $this->array = array();
       //get something from database, 
       $this->array[] = object from database;
       $this->array[] = object from database;
       ...
    }
    protected function __clone()
    {
    }

    public static function getInstance()
    {
        if (!isset(static::$instance)) {
            static::$instance = new static;
        }
        return static::$instance;
    }

    public function someFunction() {
         $this->array[0]->someField = "set something without saving it to database";
         ...
    }
}

また、シングルトン オブジェクトを取得して何かを実行する helper.php ファイルもあります。すなわち:

<?php
require "MySingleton.php";
$singleton = MySingleton::getInstance();
$singleton->someFunction();
$singleton->someOtherFunction();
?>

私の index.php では、$.ajax を使用して何かをしようとしました。

$.each(data, function(key, value) {

            $.ajax({
                url: 'helper.php',
                type: 'POST',
                data: someData,
                dataType: 'JSON'
            }).always(function(result) {

                ...

            });

});//each

私の jQuery コードでわかるように、$.ajax を数回呼び出しました。

MySingleton をトレースしたところ、同じインスタンスを返す代わりに、($.each ループ サイズに応じて) 数回作成されました。

私は記事を読みました: http://www.daniweb.com/web-development/php/threads/393405/php-singletone-pattern-in-php-files-where-ajaxs-requests-are-sent

これは、シングルトン パターンが同じリクエスト中にのみ機能するために発生します。私の場合、いくつかの ajax リクエストがあり (これも $.each ループに基づいています)、それが機能しなかった理由です。

シングルトン オブジェクトを使用している理由は、複数のデータベース接続を作成したくないためです。また、MySingleton には配列 (いくつかのオブジェクトを格納するために使用されます) があり、MySingleton クラスでは配列を使用して一時的に格納します。一部の情報をデータベースに保存せずに)

とにかく私の問題を解決する方法はありますか?私は本当に $.ajax と PHP シングルトンを使いたいと思っています。

4

1 に答える 1

1

リクエスト間でデータを保存する唯一の方法は、データをどこかに保存することです。これは基本的に、セッションまたはファイルまたはデータベース内のいずれかを意味します。

一度にすべてのデータをロードすることは、1 つのレコードのみをロードするよりも遅いとは思いません。このロード時間の 90% がリクエストの作成、データベース接続の作成などであるためです。遅すぎるので、その上にキャッシュなどを追加できますが、十分に高速になると確信しています。

于 2013-08-07T17:07:35.470 に答える