Home  >  Article  >  php教程  >  PHP多线程(pthreads)与自动加载BUG问题

PHP多线程(pthreads)与自动加载BUG问题

WBOY
WBOYOriginal
2016-05-25 16:40:251220browse

php多线程功能是php5.3才真正的支持了,下面我就尝试了pthreads功能的一个测试同时也发测试时发现了一些bug了,具体bug原因还无法解决看其它朋友有经验吗.

近日用PHP处理约7k条网络数据,现有网络情况下,耗时通常一秒一条,跑完整个程序大约近两个小时.

由于跑一次数据的时间太长,因此计划通过多个线程实现并行处理,我们可以通过pthreads扩展来实现真正的多线程,而不是常见的fsockopen来“模拟”。pthreads的官网介绍在这里:http://pthreads.org/

需要注意的是,如果尝试用数组在线程间交换数据,你会失望的,因为php的数组本身不是线程安全的,正确的做法是继承Stackable类,一个简单的demo如下所示:

<?php
class storage extends Stackable {
    public function run() {
    }
}
class my extends Thread {
    public function __construct($storage) {
        $this->storage = $storage;
    }
    public function run() {
        $i = 0; //www.phprm.com
        while (++$i < 10) {
            $this->storage[] = rand(0, 1000);
        }
        $this->synchronized(function ($thread) {
            $thread->notify();
        }  , $this);
    }
}
$storage = new storage();
$my = new my($storage);
$my->start();
$my->synchronized(function ($thread) {
    $thread->wait();
}
, $my);
var_dump($storage);
?>

上例如果$storage是array,那么dump出来的将是null,启用多线程后,跑一次数据的时间可以压缩到1000秒内,不到二十分钟,已经在我的接受范围内了.

最后发现一个自动加载BUG

线程的run方法可以继承主线程的常量,函数定义,ini_set()和自动加载不能继承,具体什么能继承什么不能继承没找到相关文档,只能自己摸索.

继承过来的函数中只能进行一些基本操作,如果试图new一个对象(比如PDO)然后返回这个对象就会导致进程意外终止,就目前来说基本不能用于生产环境.


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn