PHP pthreads v3使用中的一些坑和注意点分析

2025-05-27 0 41

本文实例讲述了PHP pthreads v3使用中的一些坑和注意点。分享给大家供大家参考,具体如下:

一、子线程无法访问父线程的全局变量,但父线程可以访问子线程的变量

  1. <?php
  2. class Task extends Thread
  3. {
  4. public $data;
  5. public function run()
  6. {
  7. global $num;
  8. var_dump($num);
  9. $this->data = 'abc';
  10. //这是打印null
  11. var_dump($GLOBALS);
  12. $GLOBALS['test'] = 'def';
  13. }
  14. }
  15. //主线程中的全局变量,子线程中是无法访问的
  16. //php中创建子线程,它会有一个单独的堆,运行在单独的地址空间中
  17. //并不能像有些语言中,子线程是可以访问的到主线程中的变量的。
  18. $num = 666;
  19. $GLOBALS['test'] = 'test';
  20. $t = new Task();
  21. $t->start() && $t->join();
  22. //主线程可以访问子线程的变量
  23. var_dump($t->data);

结果如下:

PHP pthreads v3使用中的一些坑和注意点分析

二、子线程无法修改父线程的变量

  1. <?php
  2. class Task extends Thread
  3. {
  4. private $data;
  5. public function __construct(&$data)
  6. {
  7. $this->data = $data;
  8. }
  9. public function run()
  10. {
  11. echo "task data : ", $this->data, "\\n";
  12. $this->data = 'def';
  13. echo "task data : ", $this->data, "\\n";
  14. }
  15. }
  16. $data = 'abc';
  17. //我们这里传入的是引用
  18. $t = new Task($data);
  19. $t->start() && $t->join();
  20. //但是$data变量数据并没改变
  21. //这说明我们通过构造函数传入Task对象中的$data只是一个拷贝
  22. //子线程中并不能够操作主线程中的变量
  23. var_dump($data);

结果如下:

PHP pthreads v3使用中的一些坑和注意点分析

三、pthreads v3版本可以设置成员为匿名函数

  1. <?php
  2. class Task extends Thread
  3. {
  4. private $call;
  5. public function __construct()
  6. {
  7. //pthreads v3版本好像可以设置成员为匿名函数
  8. //在v2版本中好像是不可以的
  9. $this->call = function ($param1, $param2) {
  10. echo "task call param1 : {$param1} param2 : {$param2}\\n";
  11. };
  12. }
  13. public function run()
  14. {
  15. //直接调用成员匿名函数
  16. ($this->call)("hello", "world");
  17. }
  18. }
  19. $t = new Task();
  20. $t->start() && $t->join();

结果如下:

PHP pthreads v3使用中的一些坑和注意点分析

四、对于数据库连接资源,我们需要声明为静态成员

  1. <?php
  2. class Task extends Thread
  3. {
  4. private $db;
  5. public function __construct()
  6. {
  7. //注意这里会报错,不能对PDO实例进行序列化或反序列化
  8. $this->db = new PDO('mysql:dbname=test;host=192.168.33.226', 'root', '');
  9. }
  10. public function run()
  11. {
  12. $result = $this->db->query("select id,name from tb_user");
  13. while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
  14. echo "{$row['id']}\\t{$row['name']}\\n";
  15. }
  16. }
  17. }
  18. $t = new Task();
  19. $t->start() && $t->join();

结果如下:

PHP pthreads v3使用中的一些坑和注意点分析

代码修改如下:

  1. <?php
  2. class Task extends Thread
  3. {
  4. //我们需要把数据库连接资源,声明为静态成员,然后调用静态方法进行创建
  5. private static $db;
  6. //我们直接在__construct()构造函数里对$db进行实例化,好像会是null,有兴趣的可以试试
  7. public static function getConn()
  8. {
  9. if (!is_resource(self::$db)) {
  10. self::$db = new PDO('mysql:dbname=test;host=192.168.33.226', 'root', '');
  11. }
  12. return self::$db;
  13. }
  14. public function run()
  15. {
  16. $result = self::getConn()->query("select id,name from tb_user");
  17. while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
  18. echo "{$row['id']}\\t{$row['name']}\\n";
  19. }
  20. }
  21. }
  22. $t = new Task();
  23. $t->start() && $t->join();

结果如下:

PHP pthreads v3使用中的一些坑和注意点分析

最后说明,不排除pthreads以后的版本升级上面的有些问题不会出现。

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

PHP pthreads v3使用中的一些坑和注意点分析

PHP pthreads v3使用中的一些坑和注意点分析

希望本文所述对大家PHP程序设计有所帮助。

原文链接:https://www.cnblogs.com/jkko123/p/8919013.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 PHP pthreads v3使用中的一些坑和注意点分析 https://www.kuaiidc.com/70361.html

相关文章

发表评论
暂无评论