欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP pthreads v3使用中的一些坑和注意點(diǎn)分析

 更新時(shí)間:2020年02月21日 09:23:33   作者:懷素真  
這篇文章主要介紹了PHP pthreads v3使用中的一些坑和注意點(diǎn),總結(jié)分析了PHP pthreads v3使用過(guò)程中經(jīng)常遇到的各種問(wèn)題及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了PHP pthreads v3使用中的一些坑和注意點(diǎn)。分享給大家供大家參考,具體如下:

一、子線程無(wú)法訪問(wèn)父線程的全局變量,但父線程可以訪問(wèn)子線程的變量

<?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';
  }
}

//主線程中的全局變量,子線程中是無(wú)法訪問(wèn)的
//php中創(chuàng)建子線程,它會(huì)有一個(gè)單獨(dú)的堆,運(yùn)行在單獨(dú)的地址空間中
//并不能像有些語(yǔ)言中,子線程是可以訪問(wèn)的到主線程中的變量的。
$num = 666;

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

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

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

結(jié)果如下:

二、子線程無(wú)法修改父線程的變量

<?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變量數(shù)據(jù)并沒(méi)改變
//這說(shuō)明我們通過(guò)構(gòu)造函數(shù)傳入Task對(duì)象中的$data只是一個(gè)拷貝
//子線程中并不能夠操作主線程中的變量
var_dump($data);

結(jié)果如下:

三、pthreads v3版本可以設(shè)置成員為匿名函數(shù)

<?php

class Task extends Thread
{
  private $call;


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

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

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

結(jié)果如下:

四、對(duì)于數(shù)據(jù)庫(kù)連接資源,我們需要聲明為靜態(tài)成員

<?php

class Task extends Thread
{
  private $db;

  public function __construct()
  {
    //注意這里會(huì)報(bào)錯(cuò),不能對(duì)PDO實(shí)例進(jìn)行序列化或反序列化
    $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();

結(jié)果如下:

代碼修改如下:

<?php

class Task extends Thread
{
  //我們需要把數(shù)據(jù)庫(kù)連接資源,聲明為靜態(tài)成員,然后調(diào)用靜態(tài)方法進(jìn)行創(chuàng)建
  private static $db;

  //我們直接在__construct()構(gòu)造函數(shù)里對(duì)$db進(jìn)行實(shí)例化,好像會(huì)是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();

結(jié)果如下:

最后說(shuō)明,不排除pthreads以后的版本升級(jí)上面的有些問(wèn)題不會(huì)出現(xiàn)。

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

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP進(jìn)程與線程操作技巧總結(jié)》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《PHP基本語(yǔ)法入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

相關(guān)文章

最新評(píng)論