PHP: проблема с Pthread + Memcache

Memcache, похоже, не работает внутри потока.

Я получаю это предупреждение:

Warning: Memcache::get(): No servers added to memcache connection in test.php on line 15



   class Test extends Thread {

    protected $memcache;

    function __construct() {
        $this->memcache = New Memcache;
        $this->memcache->connect('localhost',11211 ) or die("Could not connect");
    }

    public function run() {
        $this->memcache->set('test', '125', MEMCACHE_COMPRESSED, 50);
        $val = $this->memcache->get('test');p
        echo "Value $val.";
        sleep(2);
    }

}

$threads = [];
for ($t = 0; $t < 5; $t++) {
    $threads[$t] = new Test();
    $threads[$t]->start();
}

for ($t = 0; $t < 5; $t++) {
    $threads[$t]->join();
}

1 ответ

Решение

Поскольку объекты memcache не подготовлены для совместного использования между потоками, вы должны создать соединение для каждого потока с memcached, вы также должны быть уверены, что не записали подключение memcached в контекст многопоточного объекта.

Любой из следующих примеров кода хорош:

<?php
class Test extends Thread {

    public function run() {
        $memcache = new Memcache;

        if (!$memcache->connect('127.0.0.1',11211 ))
            throw new Exception("Could not connect");

        $memcache->set('test', '125', MEMCACHE_COMPRESSED, 50);
        $val = $memcache->get('test');
        echo "Value $val.\n";
    }

}

$threads = [];
for ($t = 0; $t < 5; $t++) {
    $threads[$t] = new Test();
    $threads[$t]->start();
}

for ($t = 0; $t < 5; $t++) {
    $threads[$t]->join();
}

Статическая область видимости классов представляет собой своего рода локальное хранилище потоков, что делает также полезным следующий код:

<?php
class Test extends Thread {
    protected static $memcache;

    public function run() {
        self::$memcache = new Memcache;

        if (!self::$memcache->connect('127.0.0.1',11211 ))
            throw new Exception("Could not connect");

        self::$memcache->set('test', '125', MEMCACHE_COMPRESSED, 50);
        $val = self::$memcache->get('test');
        echo "Value $val.\n";
    }

}

$threads = [];
for ($t = 0; $t < 5; $t++) {
    $threads[$t] = new Test();
    $threads[$t]->start();
}

for ($t = 0; $t < 5; $t++) {
    $threads[$t]->join();
}
Другие вопросы по тегам