PHP多线程开发的坑

说起多线程,一般的人都想到的是用C类语言,或者JAVA来开发

因为我是做PHP为主的,对JAVA了解的少,而用C实际开发项目的经验少,所以入坑了。

在这也简单的来和大家说下:

首先,我们会以CLI的方式来运行SERVER进程,在进程里,读取数据库的设备信息,实现线程的创建。

在这里,PHP基本使用的是Pthread的扩展Thread。

由于项目需要,我们在创建了线程之后,在线程里实现while(true)与设备通讯,获取设备的最新信息。

来说说重点吧:

1:服务器的环境配置,在这里大家一定要特别的注意,一定要用5.6+的ZTS-X64版本,建议使用W_PHP 7.0X或Linux 7.2.X版本,因为这两个版本网上都有最近的线程扩展模块。如果使用的是非ZTS-X64版本,那么很遗憾,线程永远开启不了超过200个。因为进行了多次的模拟测试,包括线程内执行死循环和跑完之后挂起,查看系统的资源使用,如果是X86系统下,因为内存的其他限制(详细的内存有得说了,不一一解释,自行翻资料查看86-64的内存使用哈);

2:系统版本,一般开发调试,系统的最低要求是Windows7 SP1,LINUX则无限制(但必须都是X64),因为在WINDOWS下跑Thread需要VC2015的扩展支持;如果开发则还使用Windows7的,cmd->winver里查看版本内核是否低于7001,是的话,升级为SP1解决问题;

3:线程安全:现在网上什么ZTS、NTS的说话一大堆,都是老过时的东西,现在的线程安全,都是被人抄来抄去的过期文章!

PHP的Pthread扩展,V2和V3版本有了很大的实际变更,更像多线程的操作优化了;

A:V2版本,虽然实现了多线程,但一样可以通过稀哈操作数据数组,导致频繁的线程操作,导致线程挂起

B:线程内的成员在执行的时候,已经分配了适当的内存空间,也就是说一个空变量,分配了值=int(1),这时候,是不可能进行=String的操作,更不可以变成数组等,所以在线程内获取的数据资源,需要使用其他TCP端口来接收或者其他更好的操作方法;(这才是更好的理解什么是线程安全ZTS,对内存中的所有分配好的资源,是不可以随意修改的,当然$i=0;$i=1之类的占用相同地址同类型的,还是可以的)

C:线程锁,如果多线程内需要对同一地址的数据进行操作,切忌使用锁,否则同一时间的操作导致线程的异常,也会导致线程中止退出。

D:就是线程的内存占用了,说真的,PHP的线程占用内存还真好,也许是因为我在线程内也有发起TCP请求其他的关系,导致1个线程使用内存都接近了1MB,所以我们能以行参的方式传递参数,就别用成员!数据的销毁也一定要记得!

来一段2000个的线程创建实例吧:

class ThreadMax extends thread{

private $id;

function __construct($id){

$this->id = $id;

}

function run(){

while(true){

//echo “ID=”.$this->id.”\n”; //不执行其他任务工作

sleep(1);

}

}

}

$thread = array();

for($i=1;$i<=2000;$i++){

$thread[$i] = new ThreadMax($i);

}

$default  =0;

while(true){

if($default==0){

for($i=1;$i<=2000;$i++){

$thread[$i]->start();

}

$default = 1;

}

echo “thread All is OK!”;

sleep(10);

}

return;

微信图片_20180427222654

发表评论

:wink: :-| :-x :twisted: :) 8-O :( :roll: :-P :oops: :-o :mrgreen: :lol: :idea: :-D :evil: :cry: 8) :arrow: :-? :?: :!: