pthreads — PHP ошибка в многопоточной среде, присваивающая значение родительскому статическому члену в том же потоке?

У меня есть эта проблема, где мне интересно, если это ошибка PHP или намеренное поведение. Если я назначу в дочернем классе ресурс MySQL родительскому члену, то значение будет потеряно при работе в качестве потока.

Этот код не запускается — ресурс MySQL должен отображаться дважды:

<?php
class MyFileAbstract extends Threaded
{
protected static $m_Connection;
public static function init() {
static::openFile();
echo "<br>Member accessed from parent: ";
print_r(self::$m_Connection);   # the resource is empty
}
}

class MyFile extends MyFileAbstract
{
public static function openFile() {
self::$m_Connection = fopen("/etc/php.ini", "r");
echo "<br>Member accessed from child: ";
print_r(self::$m_Connection)."<br>";   # the resource has value
}
}

class MyThread extends Thread
{
public function run() {
MyFile::init();
}

}

$myThread = new MyThread();
$myThread->start();
echo "<br>Correct output:";
MyFile::init();
?>

Это результат — ожидаемый результат для «Пользователь получил доступ от родителя:«должно быть что-то вроде»Код ресурса № 2«:

Member accessed from child: Resource id #2
Member accessed from parent:
Correct output:
Member accessed from child: Resource id #3
Member accessed from parent: Resource id #3

Я должен изменить это, а затем член $m_Connection получает / сохраняет ресурс от fopen(), Примечание: это работает в потоке!

<?php
class MyFileAbstract extends Threaded
{
protected static $m_Connection;
public static function openFile()
{
$sFileName = static::getFileName();
self::$m_Connection = fopen($sFileName, "r");
echo "Member accessed from parent: ";
print_r(self::$m_Connection);   # the resource has value
}
}

class MyFile extends MyFileAbstract
{
public static function getFileName()
{
return "/etc/php.ini";
}
}

class MyThread extends Thread
{
public function run()
{
MyFile::openFile();
}
}

$myThread = new MyThread();
$myThread->start();
?>

Выход:

Member accessed from parent: Resource id #2

Требования для запуска примеров:

  1. PHP скомпилирован с включенной безопасностью потоков
  2. PHP скомпилирован с библиотекой pThread

Я должен подключиться к MySql в теме по этой статье: http://php.net/manual/en/intro.pthreads.php

ОБНОВИТЬ:

Я изменил код: он открывается /etc/php.ini вместо подключения к базе данных MySql. Тот же результат -> ресурс теряется при возврате из расширенного класса. Примеры теперь работают 1: 1 без изменения / адаптации чего-либо.

1

Решение

Я все еще думаю, что это ошибка. Теперь я нашел обходной путь, когда ресурс явно назначен члену класса в openFile() функционировать как parent:: а не как self:::

<?php
class MyFileAbstract extends Threaded
{
protected static $m_Connection;
public static function init() {
static::openFile();
echo "<br>Member accessed from parent: ";
print_r(self::$m_Connection);   # the resource is empty
}
}

class MyFile extends MyFileAbstract
{
public static function openFile() {
# the resource keeps now the value when using parent:: instead of self::
parent::$m_Connection = fopen("/etc/php.ini", "r");
echo "<br>Member accessed from child: ";
print_r(parent::$m_Connection)."<br>";
}
}

class MyThread extends Thread
{
public function run() {
MyFile::init();
}

}

$myThread = new MyThread();
$myThread->start();
echo "<br>Correct output:";
MyFile::init();
?>

Результат теперь правильный:

Member accessed from child: Resource id #2
Member accessed from parent: Resource id #2
Correct output:
Member accessed from child: Resource id #3
Member accessed from parent: Resource id #3
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector