PHP 多線程擴展(正兒八經的線程)pthreads安裝

環境CentOS 6.3 64bit,php 5.4.5php

pthreads須要線程安全環境,mysql

下載php的安裝包,解壓:sql

  tar zxvf php-5.4.5.tar.gz//名字是否是這個我不肯定,本身去下載windows

安裝:安全

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

make測試

make installfetch

結果就把線程安裝版的php安裝到了/usr/local/php-zts,目前我不瞭解開啓線程安全到底會帶來什麼影響,因此,就弄兩個測試版本。this

若是遇到undefined reference to `executor_globals_id'spa

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

相關文章
相關標籤/搜索