1

ショッピング カート API (SOAP) エンドポイントに接続する PHP コードがいくつかあります。これは 1 つの中央サーバーに対するものではなく、任意の数のユーザー固有のエンドポイント URL に対するものです。

現在、ユーザー API への独自の接続を作成するいくつかの異なるクラスがあります。

例えば、

CartProduct.php -> updateProduct() (API 接続を作成)

CartCategory.php -> updateCategory() (API 接続を作成)

シングルトンを使用してリモート接続を共有することを考えていましたが、SO に関する質問やいくつかのブログを読んだ後、どうやら誰もがシングルトンを嫌っているようです。

私の場合、接続プールは意味がないと思います。私はリモート ユーザーの Web サイトに接続しているので、5 つの接続を開いて Web サイトの速度が低下する可能性は避けたいと考えています。この場合、このアプリケーションへの呼び出し間で 1 つの接続を共有したいと思います。DB の場合、接続プールは理にかなっていると思いますが、リモート ユーザー API の場合はそうではありません。理論的には、ユーザーが updateProduct と updateCategory を同時に実行しようとするとどうなるかを考える必要があると思います... システムが壊れますか?

いくつかの異なるクラスが共有できる接続を開くためにここで意味のある設計パターンはありますか??

4

1 に答える 1

6

I have no idea if this pattern has a name

In my humble opinion, the connection pool would actually make sense. Only you should not initialize all the connections right off. Instead use lazy initialization:

class LazyPool
{

    private $connections = [];
    private $providers = [];

    public function addProvider($name, callable $provider)
    {
        $this->providers[$name] = $provider;
        return $this;
    }

    public function getConnection($name)
    {
        if (array_key_exists($name, $this->connections) === false)
        {
            $this->connections[$name] = call_user_func($this->providers[$name]);
        }
        return $this->connections[$name];
    }

}

This class can would be used like this:

$pool = new LazyPool;

$pool->addProvider('lorem', function() use ($config){
    $instance = new SoapThing($config['wsdl_1']);
    return $instance;
});

$pool->addProvider('ipsum', function() use ($config){
    $instance = new SoapThing($config['i_think_it_was_wsdl']);
    return $instance;
});

$foo = new Foo($pool);
$bar = new Bar($pool);

This way both instance will be able to initialize SOAP connection, but if Foo initialized connection named "ipsum", then Bar instance will get from pool the already initialized SOAP client.

Disclaimer:
This code was not tested. It was written directly in the SO post editor using some copy-paste from older post of mine. This particular syntax also will require PHP 5.4+, therefore you might need to adapt it for running in older PHP 5.* versions.

于 2013-08-01T16:36:56.650 に答える