MongoDB\Driver\Manager and php pthreads multithreading

195
14 марта 2018, 07:24

Здравствуйте.

При попытке создания класса data provider, реализующего получение данных из MongoDB с использованием расширения PHP pthreads возникает ошибка:

Fatal error: Uncaught Exception: Serialization of 'MongoDB\Driver\Manager' is not allowed

Код:

class dataProvider extends Threaded
{
    private $db = null;
    private $col = null;
    private $cur = null;
    private $it = null;
    public function __construct($colName)
    {
        $this->$db = my_mongodb::getInstance();
        $this->$col = $this->$db->selectCollection($colName);
        $this->$cur = $this->$col->find(['etype'=>'CONTRACT'],[]);
        $this->$it = new IteratorIterator($this->$cur);
        $this->$it->rewind();
    }
    public function getNext()
    {
        return $this->$it->next();
    }
}

В данном случае перемнная $this->$db содержит значение типа MongoDB\Driver\Manager, переменная $this->$cur содержит значение типа MongoDB\Driver\Cursor. Ошибка возникает в строке:

$this->$db = my_mongodb::getInstance();

Если же в классе "dataProvider" переменные объявить как статические, то возникает ошибка при вызове "$provider->synchronized()"

class dataProvider extends Threaded
{
    private static $db = null;
    private static $col = null;
    private static $cur = null;
    private static $it = null;
    public function __construct($colName)
    {
        self::$db = my_mongodb::getInstance();
        self::$col = self::$db->selectCollection($colName);
        self::$cur = self::$col->find(['etype'=>'CONTRACT'],[]);
        self::$it = new IteratorIterator(self::$cur);
        self::$it->rewind();
    }
    public function getNext()
    {
        return self::$it->next();
    }
}

Ошибка: Fatal error: Uncaught Error: Call to a member function next() on null в коде:

    $provider->synchronized(
        function($provider) use (&$value) {
            $value = $provider->getNext();
        },
        $provider
    );

Получается замкнутый круг: 1. pthreads не работает со статическими переменными 2. MongoDB\Driver\Manager не поддерживает сериализацию

Вопрос: есть ли какой-нибудь метод многопоточной работы с MongoDB\Driver\Manager через pthreads?

READ ALSO
Вывод страниц из БД в Laravel

Вывод страниц из БД в Laravel

Подскажите, пожалуйста, конструкцию вывод страниц из базы данных в LaravelНапример, site

225
Как получить значение из глобального fixture?

Как получить значение из глобального fixture?

Как получить значение из глобального Fixture?

193
Профессиональное использование ООП

Профессиональное использование ООП

Вот я не понимаю, почему, когда делают какой-нибудь метод, то у него получается много вложений?

199