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

环境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

Einzelheiten zur Compiler-Optimierung finden Sie in unserem Optimierungshinweis.