您的位置:首页 > 编程语言 > PHP开发

PHP 多线程扩展(正儿八经的线程)pthreads安装

2013-09-18 09:52 288 查看
环境CentOS 6.3 64bit,php 5.4.5

pthreads需要线程安全环境,

下载php的安装包,解压:

tar zxvf php-5.4.5.tar.gz//名字是不是这个我不确定,自己去下载

安装:

./configure --enable-zts --prefix=/usr/local/php-zts //或者 --enable-maintainer-zts

make

make install

结果就把线程安装版的php安装到了/usr/local/php-zts,目前我不了解开启线程安全到底会带来什么影响,所以,就弄两个测试版本。

如果遇到undefined reference to `executor_globals_id'

make clean就可以了

下载和安装pthreads:

tar zxvf pthreads

cd pthreads-0.0.45 // 本文的是第一个stable版本

/usr/local/php-zts/bin/phpize

./configure --with-php-config=/usr/local/php-zts/bin/php-config

make

make install

/usr/local/php-zts/bin/php -i|grep "php.ini"

找出php.ini的位置,修改它把ext=pthreads.so加入进入进去,因为我原来就有php,现在新装的php.ini文件不存在我就考了一个过去……

pthreads-0.0.45/examples目录下有些示例文件,比文档有用,在线文档根本不能说明问题,我修改了一个,执行了一下:

<?php
/*
* Sharing symbols 101
* @NOTE Thread::fetch was never included in a release and was superceeded by object handlers
* 	pthreads allows read access to thread data from any context
pthreads allows write access to thread data from any context
carry on reading ...
work in progress ...
*/
class TestObject {
public $val;
}

class Fetching extends Thread {
public function run(){
/*
* of course ...
*/
$this->sym = 10245;
$this->arr = array(
"1", "2", "3"
);
echo '6'.chr(10);
/*
* objects do work, no preparation needed ...
* read/write objects isn't finalized ..
* so do the dance to make it work ...
*/
$obj = new TestObject();
$obj->val = "testval";
$this->obj = $obj;
echo '7'.chr(10);
/*
* will always work
*/
$this->objs = serialize($this->obj);
echo '8'.chr(10);
/*
* nooooooo
*/
$this->res = fopen("php://stdout", "w");
echo '9'.chr(10);
/*
* tell the waiting process we have created symbols and fetch will succeed
*/
$this->synchronized(function(){
$this->notify();
});
echo '10'.chr(10);
/* wait for the process to be finished with the stream */
$this->synchronized(function(){
$this->wait();
});
echo '11'.chr(10);
}
}
echo '0'.chr(10);
$thread = new Fetching();
echo '1'.chr(10);
$thread->start();
//sleep(1); 加了这个就不能正常工作,真奇怪
echo '2'.chr(10);
$thread->synchronized(function($me){
echo '3'.chr(10);
$me->wait();
echo '4'.chr(10);
}, $thread);
echo '5'.chr(10);

/*
* we just got notified that there are symbols waiting
*/
foreach(array("sym", "arr", "obj", "objs", "res") as $symbol){
printf("\$thread->%s: ", $symbol);
$fetched = $thread->$symbol;
if ($fetched) {
switch($symbol){
/*
* manual unserialize
*/
case "objs":
var_dump(unserialize($fetched));
break;

default: var_dump($fetched);
}
}
printf("\n");
}

/* notify the thread so it can destroy resource */
$thread->synchronized(function($me){
$me->notify();
}, $thread);
?>


/usr/local/php-zts/bin/php Fetch.php

结果:

0

1

2

3

6

7

8

9

10

4

5

$thread->sym: int(10245)

$thread->arr: array(3) {

[0]=>

string(1) "1"

[1]=>

string(1) "2"

[2]=>

string(1) "3"

}

$thread->obj: object(TestObject)#2 (1) {

["val"]=>

string(7) "testval"

}

$thread->objs: object(TestObject)#2 (1) {

["val"]=>

string(7) "testval"

}

$thread->res: resource(3) of type (stream)

11

发个全点儿的php编译参数:

./configure

--prefix=/usr/local/php-zts

--enable-sockets

--enable-pcntl

--enable-maintainer-zts

--enable-sysvmsg

--enable-mbstring

--with-mysql=/usr

--with-mysql-sock=/var/lib/mysql/mysql.sock

--with-mysqli=/usr/lib64/mysql/mysql_config

--with-pdo-mysql=/usr/lib64/mysql/mysql_config/configure

我的QQ群:

PHPer&Webgame&移动开发,群号:95303036

windows版:

http://blog.csdn.net/aoyoo111/article/details/19020161
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: