新闻中心

PHP之多线程的实现和案例实战

作者:澳门赌场  来源:澳门真人正规官网  时间:2020-04-27 17:09  点击:

  PHP 5.3 以上版本支持PHP扩展pthreads,可以使PHP真正地支持多线程。多线程在处理重复性的循环任务,能够大大缩短程序执行时间,而且多线程是个重要的核心点,我们有必要去了解它。

  进程是资源分配最小单位,线程是程序执行的最小单位。计算机在执行程序时,会为程序创建相应的进程,进行资源分配时,是以进程为单位进行相应的分配。每个进程都有相应的线程,在执行程序时,实际上是执行相应的一系列线程。

  进程有独立的地址空间,线程没有独立的地址空间。每启动一个进程,系统都会为其分配地址空间,建立数据表来维护代码段、堆栈段和数据段;而同一进程的线程则共享本进程的地址空间。

  每个独立的进程有一个程序运行的入口和顺序执行序列。但是线程不独立执行,必须依存在应用程序执行。

  线程是处理机调度的基本单位,但进程不是。由于程序执行的过程其实是执行具体的线程,那么处理机处理的也是程序相应的线程,所以处理机调度的基本单位是线程。

  实现PHP伪多线程原理是利用服务器(apache/nginx/php-fpm)是多线程的特点,当我们每次对某个PHP文件进行访问,服务器都会创建一个新的进程/线程,用来执行对应的PHP文件;当然,我们还能使用curl、fsockopen等PHP内置调用另一个PHP文件。

  pcntl_fork函数依赖Linux操作系统fork的实现,因此这个函数必须在Linux环境下使用。

  在当前进程的当前位置创建子进程,父进程和子进程都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程号,而子进程得到的是0。

  成功时,在父进程执行线程内返回产生的子进程的PID,在子进程执行线。失败时,在 父进程上下文返回-1,不会创建子进程,并且会引发一个PHP错误。

  pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。

  //从这里开始写的代码是父进程的,因为写的是系统程序,记得退出的时候给个返回值

  //从这里开始写的代码都是在子进程里执行的,同样正常退出的话,最好也给一个返回值

  //如果你父进程希望知道子进程正常退出的话,可以加上前面的pcntl_wait

  PHP 默认并不支持多线程,要使用多线程就需要安装 pthread 多线程扩展。

  运行以上代码出现 Hello World,出现下图说明pthreads扩展安装成功

  PHP 将线程封装成Thread 类,线程的创建通过实例化一个线程对象来实现,由于类的封装性,变量的使用只能通过构造函数传入,而线程运算结果也需要通过类变量传出,下面介绍几个常用的 Thread 类方法。

  run():抽象方法,每个线程都要实现此方法,线程开始运行后,此方法中的代码会自动执行。

  join():各个线程相对于主线程都是异步执行,调用此方法会等待线程执行结束。

  isRunning():返回线程的运行状态,线程正在执行run()方法的代码时会返回 true。

  锁的粒度过大存在性能问题,可能会导致只有1个线程在运行,其他线程都在等待锁

  同时使用多个锁,逻辑复杂,一旦某个锁没被正确释放,可能会发生线程死锁。

  可以充分利用cpu,调度的系统开销比进程小,共享内存空间,不需要额外的IPC通信

  但多线程可能会引入其他问题,如数据同步,资源竞争,死锁等,处理不好容易出问题

  多进程的优点,稳定,虽然进程之间数据不共享,但还是能够通过IPC实现数据共享,最重要的是

  总的来说,如果选择使用多线程,就意味着PHP-FPM无法使用,多线程如果想使用在FAST-CGI/CGI上,就需要有新的东西支持;另外,对PHP来说一个请求是单线程的,但是多个请求间是并发的,像Apache、Nginx都是通过多线程处理用户请求的。因此,当有很多用户请求php时,是多个进程来处理用户请求的,瓶颈多数都是读写数据库、文件、session等这些会加锁的地方,而解决这些问题,业界都已经有了很成熟的方案,可自行百度。

  代码详见daemon.php,这里我参考别人的,限于水平不够,我也有点搞不懂

  这章节主要是了解和应用PHP扩展pthreads,以及进程线程的一些基本概念和区别,我记得我之前面试的时候,面试官问过我进程之间的通信是怎么样实现的,我答不出来,哎,底子有点薄,一步一步慢慢来,接下来我会总结和实战一下进程间通信、workerman、swoole等技术栈。

澳门赌场

上一篇:分享六道家常美食做法简单清爽开胃大人小孩都爱吃!

下一篇:USB接口扩展转换器笔记本电脑30接口分线器一拖四HUB集线器充电