亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在PH中使用pthreads v3時需要注意哪些問題

發布時間:2021-01-16 09:50:50 來源:億速云 閱讀:145 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關在PH中使用pthreads v3時需要注意哪些問題,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

一、子線程無法訪問父線程的全局變量,但父線程可以訪問子線程的變量

<?php

class Task extends Thread
{
  public $data;

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

    //這是打印null
    var_dump($GLOBALS);
    $GLOBALS['test'] = 'def';
  }
}

//主線程中的全局變量,子線程中是無法訪問的
//php中創建子線程,它會有一個單獨的堆,運行在單獨的地址空間中
//并不能像有些語言中,子線程是可以訪問的到主線程中的變量的。
$num = 666;

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

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

//主線程可以訪問子線程的變量
var_dump($t->data);

結果如下:

在PH中使用pthreads v3時需要注意哪些問題

二、子線程無法修改父線程的變量

<?php

class Task extends Thread
{
  private $data;

  public function __construct(&$data)
  {
    $this->data = $data;
  }

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

$data = 'abc';

//我們這里傳入的是引用
$t = new Task($data);
$t->start() && $t->join();

//但是$data變量數據并沒改變
//這說明我們通過構造函數傳入Task對象中的$data只是一個拷貝
//子線程中并不能夠操作主線程中的變量
var_dump($data);

結果如下:

在PH中使用pthreads v3時需要注意哪些問題

三、pthreads v3版本可以設置成員為匿名函數

<?php

class Task extends Thread
{
  private $call;


  public function __construct()
  {
    //pthreads v3版本好像可以設置成員為匿名函數
    //在v2版本中好像是不可以的
    $this->call = function ($param1, $param2) {
      echo "task call param1 : {$param1} param2 : {$param2}\n";
    };
  }

  public function run()
  {
    //直接調用成員匿名函數
    ($this->call)("hello", "world");
  }
}

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

結果如下:

在PH中使用pthreads v3時需要注意哪些問題

四、對于數據庫連接資源,我們需要聲明為靜態成員

<?php

class Task extends Thread
{
  private $db;

  public function __construct()
  {
    //注意這里會報錯,不能對PDO實例進行序列化或反序列化
    $this->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();

結果如下:

在PH中使用pthreads v3時需要注意哪些問題

代碼修改如下:

<?php

class Task extends Thread
{
  //我們需要把數據庫連接資源,聲明為靜態成員,然后調用靜態方法進行創建
  private static $db;

  //我們直接在__construct()構造函數里對$db進行實例化,好像會是null,有興趣的可以試試
  public static function getConn()
  {
    if (!is_resource(self::$db)) {
      self::$db = new PDO('mysql:dbname=test;host=192.168.33.226', 'root', '');
    }
    return self::$db;
  }

  public function run()
  {
    $result = self::getConn()->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();

結果如下:

在PH中使用pthreads v3時需要注意哪些問題

最后說明,不排除pthreads以后的版本升級上面的有些問題不會出現。

我的php版本是7.2.4,pthreads的版本是3.1.7dev

在PH中使用pthreads v3時需要注意哪些問題

在PH中使用pthreads v3時需要注意哪些問題

關于在PH中使用pthreads v3時需要注意哪些問題就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

岑溪市| 横峰县| 湟中县| 泽州县| 土默特左旗| 乌审旗| 静海县| 瓮安县| 郧西县| 潍坊市| 深圳市| 丹阳市| 玉溪市| 克山县| 绥化市| 馆陶县| 呈贡县| 淮安市| 金乡县| 那曲县| 尼木县| 西畴县| 乐昌市| 汕头市| 阿城市| 博客| 九龙坡区| 汉阴县| 余干县| 六安市| 民和| 五原县| 永寿县| 崇阳县| 林西县| 康乐县| 洛阳市| 平凉市| 宜黄县| 措美县| 曲沃县|