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

PHP系统编程--01.多进程与多线程的更多相关文章

  1. Python - 并发编程,多进程,多线程

    传送门 https://blog.csdn.net/jackfrued/article/details/79717727 在此基础上实践和改编某些点 1. 并发编程 实现让程序同时执行多个任务也就是常 ...

  2. python并发编程之多进程、多线程、异步和协程

    一.多线程 多线程就是允许一个进程内存在多个控制权,以便让多个函数同时处于激活状态,从而让多个函数的操作同时运行.即使是单CPU的计算机,也可以通过不停地在不同线程的指令间切换,从而造成多线程同时运行 ...

  3. python并发编程之多进程、多线程、异步、协程、通信队列Queue和池Pool的实现和应用

    什么是多任务? 简单地说,就是操作系统可以同时运行多个任务.实现多任务有多种方式,线程.进程.协程. 并行和并发的区别? 并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任 ...

  4. 【Linux】关于Linux的系统编程总结

    作者:李春港 出处:https://www.cnblogs.com/lcgbk/p/14673383.html 目录 系统编程 (一)进程 1.进程的概念 2.进程函数接口 (1)fork()在进程内 ...

  5. 系统编程.py(多进程与多线程干货)

    1.并发与并行* 多个任务轮换在CPU上跑叫并发* 多个任务在多个CPU上跑,没有交替执行的* 状态叫并行.通常情况下都是并发,即使是多核.* 而控制进程先执行谁后执行谁通过操作系统的调度算法.目前已 ...

  6. Linux系统编程温故知新系列 --- 01

    1.大端法与小端法 大端法:按照从最高有效字节到最低有效字节的顺序存储,称为大端法 小端法:按照从最低有效字节到最高有效字节的顺序存储,称为小端法 网际协议使用大端字节序来传送TCP分节中的多字节整数 ...

  7. Cpython解释器下实现并发编程——多进程、多线程、协程、IO模型

    一.背景知识 进程即正在执行的一个过程.进程是对正在运行的程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都 ...

  8. python多进程与多线程编程

    进程(process)和线程(thread)是非常抽象的概念.多线程与多进程编程对于代码的并发执行,提升代码运行效率和缩短运行时间至关重要.下面介绍一下python的multiprocess和thre ...

  9. Python多进程与多线程编程及GIL详解

    介绍如何使用python的multiprocess和threading模块进行多线程和多进程编程. Python的多进程编程与multiprocess模块 python的多进程编程主要依靠multip ...

随机推荐

  1. Calculator PartⅢ

    GitHub/object-oriented The title of the work 这次敲代码耗时相对较短,但是始终无法完成debug步骤,目前上传的代码可以通过编译,但运行即报停,问题调试为内 ...

  2. Calculator 2

    github地址:https://github.com/YooRarely/object-oriented.git 新增: 计算类(拥有计算功能) 采用符号优先级计算方法 对符号不匹配的如 -2 ,自 ...

  3. C#命名参数

    文章:史上最全的ASP.NET MVC路由配置,以后RouteConfig再弄不懂神仙都难救你啦~ 命名参数规范+匿名对象 routes.MapRoute(name: "Default&qu ...

  4. Alpha 冲刺4

    队名:日不落战队 安琪(队长) 今天完成的任务 组织第四次站立式会议. 完成40%草稿箱前端界面. 明天的计划 剩下的60%草稿箱前端界面. 如果还有时间,尝试去调用数据. 还剩下的任务 回收站前端界 ...

  5. 201621044079 week13 网络

    作业13-网络 1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以 ...

  6. c语言作业1

  7. ServiceMessage

    <?php class ServiceMessage { private $errorCode = array( '1000' => "系统错误", '1001' =& ...

  8. 在c++中调用exe程序进行操作

    #include <Windows.h> #include <iostream> #include <direct.h> #define picNum 228 us ...

  9. IE BHO的IObjectWithSite接口

    Internet Explorer的BHO的对象必须实现IObjectWithSite接口.该接口是IE用来对插件进行管理和通讯的一个接口,其有SetSite和GetSite两个方法,当IE加载和卸载 ...

  10. HTML5 iframe sandbox javascript getTime

    1 1 HTML5 iframe sandbox 1 1 <!DOCTYPE html> <html> <body> <iframe src="de ...