PHP中提供了一个扩展pcntl,可以利用操作系统的fork调用来实现多进程。fork调用后执行的代码将是并行的。

PHP官方没有提供多线程的扩展,pecl中有一个pthreads扩展提供了多线程的特性,地址是http://pecl.php.net/package/pthreads,此扩展仅在线程安全版本中可用。

多进程

  1. 使用多进程, 子进程结束以后, 内核会负责回收资源
  2. 使用多进程, 子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程.
  3. 一个常驻主进程, 只负责任务分发, 逻辑更清楚.
  4. 多进程方式更加稳定,另外利用进程间通信(IPC)也可以实现数据共享。
  5. 共享内存,这种方式和线程间读写变量是一样的,需要加锁,会有同步、死锁问题。
  6. 消息队列,可以采用多个子进程抢队列模式,性能很好

多线程

  1. 线程是在同一个进程内的,可以共享内存变量实现线程间通信
  2. 线程比进程更轻量级,开很大量进程会比线程消耗更多系统资源
  3. 多线程也存在一些问题:

    • 线程读写变量存在同步问题,需要加锁
    • 锁的粒度过大存在性能问题,可能会导致只有1个线程在运行,其他线程都在等待锁
    • 同时使用多个锁,逻辑复杂,一旦某个锁没被正确释放,可能会发生线程死锁
    • 某个线程发生致命错误会导致整个进程崩溃

php搭建pcntl

在PHP中进程控制支持默认是关闭的。您需要使用 –enable-pcntl 配置选项重新编译PHP来打开进程控制支持。注:pcntl只支持Linux版本

##本例用的php版本的是5.3.3,
cd php-5.3.3/ext/pcntl
phpize
./configure --with-php-config=/usr/local/bin/php-config
make
make isntall

在php.ini下加入pcntl.so即可

extension=pcntl.so

代码演示

现在我们通过 pcntl扩展来调用操作系统的fork实现多进程。fork调用后执行的代码将是并行的。

<?php
$pid = pcntl_fork();
if($pid > 0){
echo "parent\n";
}elseif($pid == 0){
echo "child\n";
}else{
echo "error\n";
}

参考地址:

http://php.net/manual/zh/book.pcntl.php

http://www.laruence.com/2009/06/11/930.html

最新文章

  1. 创建Maven web项目时 出现 web.xml is missing and &lt;failOnMissingWebXml&gt; is set to true错误 pox.xml编译错误
  2. gruntJs篇之connect+watch自动刷新
  3. ConfigurationManager配置操作
  4. bzoj 1034 [ZJOI2008]泡泡堂BNB(贪心)
  5. 比较ASP生成静态HTML文件的几种方法
  6. MVC自定义AuthorizeAttribute实现权限管理
  7. JAVA 异常向上抛和向下抛的优劣势
  8. 【转载】Perl中的引用
  9. Bootstrap里的文件分别代表什么意思及其引用方法
  10. OC转场动画UIViewControllerTransitioningDelegate
  11. PHP函数总结 (四)
  12. 初级版python登录验证,上传下载文件加MD5文件校验
  13. Training Neural Networks: Q&amp;A with Ian Goodfellow, Google
  14. aarch64_c2
  15. 20155226 2016-2017-2 《Java程序设计》第3周学习总结
  16. Appium+python自动化16-appium1.6在mac上环境搭建启动ios模拟器上Safari浏览器
  17. 算法笔记_009:字符串匹配(Java)
  18. 2018HN省队集训
  19. tp5 select回显
  20. 由一篇博文做出的代码,不用Math.round()如何实现其功能

热门文章

  1. TCP系列37—Keep Alive—1、TCP存活检测
  2. erlang+thrift配合开发
  3. OSG学习:响应键盘鼠标示例
  4. MongoDb Driver For Net
  5. 工具函数:cookie的添加、获取、删除
  6. C# 使用this的形参
  7. AngularJS 中特性(attr)和属性(prop)的区别
  8. mysql(一) 关联查询的方式
  9. 【Windows】Windows Restart Manager 重启管理器
  10. 【Python】面向对象--类的特殊成员方法