说起多线程,一般的人都想到的是用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;
关于作者