Рубрики
Uncategorized

Анализ некоторых подводных камней и моментов, на которые следует обратить внимание при использовании потоков PHP V3

Автор оригинала: David Wong.

В этой статье описаны некоторые подводные камни и моменты, на которые следует обратить внимание при использовании PHP threads V3 с примерами. Подробности заключаются в следующем:

1. Дочерний поток не может получить доступ к глобальным переменным родительского потока, но родительский поток может получить доступ к переменным дочернего потока

php

class Task extends Thread
{
  public $data;

  public function run()
  {
    global $num;
    var_dump($num);
    $this->data = 'abc';

    //This is printing null
    var_dump($GLOBALS);
    $GLOBALS['test'] = 'def';
  }
}

//Global variables in the main thread cannot be accessed in the child thread
//PHP, which will have a separate heap and run in a separate address space
//It's not like in some languages that subthreads can access variables in the main thread.
$num = 666;

$GLOBALS['test'] = 'test';

$t = new Task();
$t->start() && $t->join();

//The main thread can access the variables of the child thread
var_dump($t->data);

Результаты заключаются в следующем

2. Дочерний поток не может изменять переменную родительского потока

data = $data;
  }

  public function run()
  {
    echo "task data : ", $this->data, "\n";
    $this->data = 'def';
    echo "task data : ", $this->data, "\n";
  }
}

$data = 'abc';

//What we pass in here is a reference
$t = new Task($data);
$t->start() && $t->join();

//But the $data variable doesn't change
//This means that the $data we pass in to the task object through the constructor is just a copy
//Variables in the main thread cannot be manipulated in a child thread
var_dump($data);

Результаты заключаются в следующем

3, Версия Pthreads V3 может устанавливать участников в качестве анонимных функций

call = function ($param1, $param2) {
      echo "task call param1 : {$param1} param2 : {$param2}\n";
    };
  }

  public function run()
  {
    //Calling member anonymous functions directly
    ($this->call)("hello", "world");
  }
}

$t = new Task();
$t->start() && $t->join();

Результаты заключаются в следующем

4. Для ресурсов подключения к базе данных нам необходимо объявить их статическими членами

db = new PDO('mysql:dbname=test;host=192.168.33.226', 'root', '');
  }

  public function run()
  {
    $result = $this->db->query("select id,name from tb_user");
    while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
      echo "{$row['id']}\t{$row['name']}\n";
    }
  }
}

$t = new Task();
$t->start() && $t->join();

Результаты заключаются в следующем

Код изменяется следующим образом:

query("select id,name from tb_user");
    while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
      echo "{$row['id']}\t{$row['name']}\n";
    }
  }
}

$t = new Task();
$t->start() && $t->join();

Результаты заключаются в следующем

Наконец, некоторые из вышеперечисленных проблем не возникнут, если мы не исключим обновление более поздней версии pthreads.

Моя версия PHP-7.2.4, а версия pthreads-3.1.7 dev

Для получения дополнительной информации о PHP читатели, интересующиеся этим сайтом, могут ознакомиться со следующими темами: краткое описание навыков работы с процессами и потоками PHP, краткое описание навыков сетевого программирования PHP, вводный курс базового синтаксиса PHP, полная коллекция навыков работы с массивами PHP, краткое описание использования строк PHP “Руководство по работе с базой данных PHP + MySQL” и “Краткое описание навыков работы с общей базой данных PHP”

Я надеюсь, что эта статья будет полезна для программирования на PHP.