在说明多线程的题前,需要弄清楚以下几个问题

1,ts 和 nts的区别

Thread Safe和NoneThread Safe

先说windows的,在php官网,在windows区域有在文件下在有

http://windows.php.net/download#php-7.0

文件名有很明显区分

VC14 x86 Non Thread Safe (2016-May-25 23:02:14)

VC14 x86 Thread Safe (2016-May-25 23:02:14)

VC6与VC9的区别:

VC6版本是使用Visual Studio 6编译器编译的,如果你的PHP是用Apache来架设的,那你就选择VC6版本。

VC9版本是使用Visual Studio 2008编译器编译的,如果你的PHP是用IIS来架设的,那你就选择 VC9版本。

VC9版本是针对IIS服务器的版本,没有对APACHE的支持,而VC6版本对IIS和apache都提供了支持

 

Windows版的PHP从版本5.2.1开始有Thread Safe和NoneThread Safe之分。

先从字面意思上理解,Thread Safe是线程安全,执行时会进行线程(Thread)安全检查,以防止有新要求就启动新线程的CGI执行方式而耗尽系统资源。Non Thread Safe是非线程安全,在执行时不进行线程(Thread)安全检查。

Linux上的PHP同样有NTS和TS版本的区别,默认是NTS版本,configure时加上--enable-maintainer-zts则编译为TS版本.什么时候需要TS版本呢?比如你要使用pthreads这个多线程的PECL扩展时,或者PHP以MOD_PHP嵌入多线程运行下的Apache,比如Apache在Linux上提供的Event MPM就是一个多进程多线程的工作模型,Windows上Apache采用的WinNT MPM也是一个多线程模型,这时都需要TS版本的PHP.


而如果以PHP-FPM(比如搭配Nginx或者Apache的mod_fastcgi)或者PHP-CGI(比如搭配Apache的mod_fcgid或者Win上的IIS)来运行PHP,则一般都不需要TS线程安全版本的PHP.这个在之前博客也说过

2,运行模式

1)CGI(通用网关接口 / Common Gateway Interface)

2)FastCGI(常驻型CGI / Long-Live CGI)

3)CLI(命令行运行 / Command Line Interface)

4)Web模块模式(Apache等Web服务器运行的模式)

5)ISAPI(Internet Server Application Program Interface)

备注:在PHP5.3以后,PHP不再有ISAPI模式,安装后也不再有php5isapi.dll这个文件。要在IIS6上使用高版本PHP,必须安装FastCGI 扩展,然后使IIS6支持FastCGI。

为什么要说运行模式呢?因为在有些扩展并发的时候,有些扩展只能在cli下运行,其实不是

3,php多线程

目前常用的扩展有pcnlt,POSIX ,pthreads,这三个比较多,但是与其说是多线程其实多进程,在并发的时候会巨急消耗内存所以用的时候,请注意,比如pcnlt,

真的多线程只有pthreads,但是本人没有确认过,参看http://zyan.cc/pthreads/,因为我现在的测试环境是nts的,所有测试就必须重新在做一个新环境

所以来不及测试,后续更新测试结果,还有一个问题就是php-fpm去管理php的内存带来的php并发效果不错,但是php-fpm会有一个坏处就是执行完之后,不会主动把内存

还给系统而是吧资源依然控制在php-fpm,所以为什么php第一次运行慢,第二次速度就上来了,这个就带来一个问题关于php-fpm分配内存的选择

dm有三种分配方式dynamic ,static,demand,光这个调优就得一片文章来讲,所以pcnlt在服务器正式环境使用 最好是吧内存弄大一些,而且并发数也不要多

不然很容易内存消耗过多,导致错误,这里还有一个地方值得注意的是,当php以静态模块在apache下运行的时候内存消耗是怎么样的,会及时还给系统吗?,和php-fpm管理内存对比也是值得注意的,这测试也是有必要去做的

4,实际运用和测试

在php的源码包的ext下面有下面很多扩展

bcmath dba fileinfo iconv mbstring odbc pdo_firebird phar shmop sqlite3 tokenizer zip
bz2 dom filter imap mcrypt opcache pdo_mysql posix simplexml standard wddx zlib
calendar enchant ftp interbase mssql openssl pdo_oci pspell skeleton sybase_ct xml
com_dotnet ereg gd intl mysql pcntl pdo_odbc readline snmp sysvmsg xmlreader
ctype exif gettext json mysqli pcre pdo_pgsql recode soap sysvsem xmlrpc
curl ext_skel gmp ldap mysqlnd pdo pdo_sqlite reflection sockets sysvshm xmlwriter
date ext_skel_win32.php hash libxml oci8 pdo_dblib pgsql session spl tidy xsl

安装pcntl

在php的源码包里面ext下面会有,如果前期没有在编译时安装上需要扩展,不必要重新编译,

我php安装在/usr/local/php/bin

cd到pcntl

cd /usr/local/src/php-5.6.2/ext

/usr/local/php/bin/phpize

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

make && make install

在 php.ini 里面加上

extension=pcntl.so

restart php-fpm 和nginx

php-m 或者phpinfo查看下扩展是否成功

下面是一个简单的测试代码

<?php

set_time_limit(0);
error_reporting(E_ALL);
$sc = new SoapClient('http://10.168.33.22/Service.svc?wsdl'); //正式服测试机器接口性能测试 // var_dump($return->GetOrderNoResult); $file='./log.txt'; //多线程性能测试+压力测试 //$max = 2000;
$workers =10; $pids = array();
for($i = 0; $i < $workers; $i++){
$pids[$i] = pcntl_fork();
$pid = pcntl_fork(); if ($pid == -1) {
//错误处理:创建子进程失败时返回-1.
die('could not fork');
} else if ($pid) {
//父进程会得到子进程号,所以这里是父进程执行的逻辑
pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
} else {
//子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
// var_dump($pid[$i]); for($j= $i*5;$j<=($i+1)*5;$j++){
$start = microtime(true);
$return = $sc->Get();
if($return->GetResult){ $end = microtime(true);
$time = $end - $start; $str = '第'.$j.'请求成功,消耗时间-'.$time.'-占用订单号-'.$return->Get1.'<br>';
$fp = fopen($file, "a");
fwrite($fp, $str);
fclose($fp);
echo $str;
}else{ $end = microtime(true);
$time = $end - $start; $str = '第'.$j.'请求失败,消耗时间-'.$time.'-占用订单号-'.$return->Get1.'<br>';
$fp = fopen($file, "a");
fwrite($fp, $str);
fclose($fp);
echo $str;
}
} }
}

你可以运行的时候top看下,并发急剧消耗的内存,这个代码测试可以你线上正式服并发情况,比如你要测试首页服务器最大并发数,在内网机器,或者本地大内存机器上做测试,小内存机器用这个测不出极限值

php多线程详解的更多相关文章

  1. iOS开发——多线程OC篇&多线程详解

    多线程详解 前面介绍了多线程的各种方式及其使用,这里补一点关于多线程的概念及相关技巧与使用,相信前面不懂的地方看了这里之后你就对多线程基本上没有什么问题了! 1——首先ios开发多线程中必须了解的概念 ...

  2. iOS开发——GCD多线程详解

    GCD多线程详解 1. 什么是GCD Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,简单来说,GCD就是iOS一套解决多线程的机制,使用GCD能够最大限度简化多线程 ...

  3. Java 多线程详解(四)------生产者和消费者

    Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程: ...

  4. java中多线程详解-synchronized

    一.介绍 当多个线程涉及到共享数据的时候,就会设计到线程安全的问题.非线程安全其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”.发生脏读,就是取到的数据已经被其他的线 ...

  5. python多线程详解

    目录 python多线程详解 一.线程介绍 什么是线程 为什么要使用多线程 二.线程实现 threading模块 自定义线程 守护线程 主线程等待子线程结束 多线程共享全局变量 互斥锁 递归锁 信号量 ...

  6. C#多线程详解(一) Thread.Join()的详解

    bicabo   C#多线程详解(一) Thread.Join()的详解 什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程 ...

  7. Java多线程详解(二)

    评论区留下邮箱可获得<Java多线程设计模式详解> 转载请指明来源 1)后台线程 后台线程是为其他线程服务的一种线程,像JVM的垃圾回收线程就是一种后台线程.后台线程总是等到非后台线程死亡 ...

  8. Delphi多线程详解

    (整理自网络) Delphi多线程处理 1-1多线程的基本概念 WIN 98/NT/2000/XP 是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU 运行时间和资源,或者 ...

  9. Java中的多线程详解

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

随机推荐

  1. 第七届山东省ACM省赛

    激动人心的省赛终于结束了…平静下来再回头看真的感觉一波三折…先是赛前毫无预兆的查出突发性耳聋…伴随而来的就是左耳听力下降.轻微耳鸣.极个别情况下的头晕…不过这都还好,毕竟药物可以恢复…热身赛只过了一道 ...

  2. php换行符

    1.需求 统一php换行符 2.实践 使用PHP_EOL替换换行符,保证平台的兼容性. 类似的有DIRECTORY_SEPARATOR 参考文档:http://www.cnblogs.com/code ...

  3. ubuntu下MySQL中文乱码(新版本Mysql修改方法)

    前几天在开发的时候出现了中文查询阿里云服务器上的mysql的时候,查询出来的值为空,找了好久终于发现原因是ubuntu下的mysql无法识别中文,这就涉及到要调整编码格式啦!!!! 然后就在网上查了许 ...

  4. MST 001

    一.String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的? 答:   1.String是字符串常量,StringBuffer和StringB ...

  5. 设置app的启动图

    Step1 1.点击Image.xcassets 进入图片管理,然后右击,弹出"New Launch Image" 2.如图,右侧的勾选可以让你选择是否要对ipad,横屏,竖屏,以 ...

  6. 算法系列:FFT 001

    转载自http://blog.csdn.net/orbit/article/details/17210461 2012年9月的时候,一个南京的大学生从电视台播放的一段记者采访360总裁周鸿祎的视频中破 ...

  7. C语言中字符串结束符'\0'

    转自:http://www.cnblogs.com/kaituorensheng/archive/2013/12/09/3464462.html 本质 '\0'就是8位的00000000,因为字符类型 ...

  8. JS截字符串处理数字,汉字,英文问题

    <script> function suolve( str,sub_length ){ var temp1 = str.replace(/[^\x00-\xff]/g,"**&q ...

  9. freemarker内置函数和用法

    原文链接:http://www.iteye.com/topic/908500 在我们应用Freemarker 过程中,经常会操作例如字符串,数字,集合等,却不清楚Freemrker 有没有类似于Jav ...

  10. 【Junit 报错】Test class should have exactly one public zero-argument constructor和Test class can only have one constructor

    错误1: java.lang.Exception: Test class should have exactly one public zero-argument constructor at org ...