php多进程

PHP多进程处理tcp连接

二次信任 提交于 2020-08-06 06:29:32
<?php if(($sock = socket_create(AF_INET, SOCK_STREAM, 0)) < 0) { echo "failed to create socket: ".socket_strerror($sock)."n"; exit(); } if(($ret = socket_bind($sock,'127.0.0.1', 8888)) < 0) { echo "failed to bind socket: ".socket_strerror($ret)."n"; exit(); } if( ( $ret = socket_listen( $sock, 0 ) ) < 0 ) { echo "failed to listen to socket: ".socket_strerror($ret)."n"; exit(); } while (true) { $conn = @socket_accept($sock); //子进程 if(pcntl_fork() == 0) { $recv = socket_read($conn, 8192); //处理数据 $send_data = "server: ".$recv; socket_write($conn, $send_data); socket_close($conn); exit(0); } else

PHP 中的多进程使用,进程通信、进程信号等详解

三世轮回 提交于 2020-07-28 08:46:31
多进程环境要求 Linux 系统 php-cli 模式 pcntl 扩展 或 swoole 扩展 pcntl 扩展 <?php $str = "hello world!" . PHP_EOL; // 派生一个子进程,子进程会复制主进程中的上下文 // pcntl_fork 函数在主进程中返回子进程的进程ID,在子进程返回0,失败在主进程返回-1 $pid = pcntl_fork(); // 这里开始的代码,会被主进程、子进程共同执行 echo $str; if($pid > 0) { echo "我是主进程,子进程的pid是{$pid}" . PHP_EOL; } elseif($pid == 0) { echo "我是子进程,我的pid是". getmypid() . PHP_EOL; }else{ echo "我是主进程,开启子进程失败" . PHP_EOL; } swoole 扩展 <?php use Swoole\Process; $str = "hello world!" . PHP_EOL; // 实例化一个进程类 $process = new Process(function() use($str) { echo $str; echo "我是子进程,我的pid是" . getmypid() . PHP_EOL; }); // 开启子进程,成功返回子进程的PID

PHP多进程、信号量及孤儿进程和僵尸进程

徘徊边缘 提交于 2020-04-09 04:52:20
PHP多进程、信号量及孤儿进程和僵尸进程 实际上PHP是有多线程的,只是很多人不常用。使用PHP的多线程首先需要下载安装一个线程安全版本(ZTS版本)的PHP,然后再安装pecl的 pthread 扩展。 实际上PHP是有多进程的,有一些人再用,总体来说php的多进程还算凑合,只需要在安装PHP的时候开启 pcntl 模块(是不是跟UNIX中的fcntl有点儿…. ….)即可。在*NIX下,在终端命令行下使用 php -m 就可以看到是否开启了 pcntl 模块。 所以我们只说php的多进程,至于php多线程就暂时放到一边儿。 注意:不要在apache或者fpm环境下使用php多进程,这将会产生不可预估的后果。 PHP多进程初探 进程是程序执行的实例,举个例子有个程序叫做 “ 病毒.exe ”,这个程序平时是以文件形式存储在硬盘上,当你双击运行后,就会形成一个该程序的进程。系统会给每一个进程分配一个唯一的非负整数用来标记进程,这个数字称作进程ID。当该进程被杀死或终止后,其进程ID就会被系统回收,然后分配给新的其余的进程。 说了这么多,这鬼东西有什么用吗?我平时用CI、YII写个CURD跟这个也没啥关联啊。实际上,如果你了解APACHE PHP MOD或者FPM就知道这些东西就是多进程实现的。以FPM为例,一般都是nginx作为http服务器挡在最前面

基于pcntl的PHP进程池

孤人 提交于 2020-03-26 14:46:28
3 月,跳不动了?>>> 想必大家都知道可以通过多进程或者多线程的方式实现异步。 PHP多进程编程当前主要有这几种方式: 基于pcntl实现多进程,这也是PHP自带的多进程玩法 Swoole自己修改PHP内核代码,从而实现多进程,这个看起来比较新 Swoole自己修改PHP内核代码,从而实现多进程 inple_fork这个库,实现了多进程和进程池。 一,安装 用composer安装。 composer require jenner/simple_fork 二,使用 simple_fork这个库自带了很多内容,在此主要跟大家分享进程和进程池的使用,其他内容可以自行查看demo。 没有用过composer的朋友,需要根据自己的代码路径,导入autoload.php,在此略过。 需要在命令行下运行。 1.进程 使用步骤大致如下: 任务是一个实现了Runnable接口的类,或者直接用callback也可以。 初始化子进程Process,并把任务实例作为参数传递过去 最后start开启子进程,wait用于等待子进程运行结束(否则会出现僵尸进程)。 用起来也很简单 use Jenner\SimpleFork\Runnable; use Jenner\SimpleFork\Process; class Task implements Runnable { /** * @return void *

PHP进程及进程间通信

给你一囗甜甜゛ 提交于 2020-03-26 14:41:48
3 月,跳不动了?>>> 环境 php中的进程是以扩展的形式来完成。通过这些扩展,我们能够很轻松的完成进程的一系列动作。 pcntl扩展: 主要的进程扩展,完成进程创建于等待操作。 posix扩展: 完成posix兼容机通用api,如获取进程id,杀死进程等。 sysvmsg扩展: 实现system v方式的进程间通信之消息队列。 sysvsem扩展: 实现system v方式的信号量。 sysvshm扩展: 实现system v方式的共享内存。 sockets扩展: 实现socket通信。 这些扩展只能在linux/mac中使用,window下是不支持。最后建议php版本为5.5+。 简单的例子 一个简单的PHP多进程例子,该例子中,一个子进程,一个父进程。子进程输出5次,退出程序。 $parentPid = posix_getpid(); echo "parent progress pid:{$parentPid}\n"; $childList = array(); $pid = pcntl_fork(); if ( $pid == -1) { // 创建失败 exit("fork progress error!\n"); } else if ($pid == 0) { // 子进程执行程序 $pid = posix_getpid(); $repeatNum = 5; for

PHP多进程编程(三)多进程抓取网页的演示

隐身守侯 提交于 2020-03-10 03:37:22
要理解这个部分的代码,请阅读: 用 Socket 和 Pcntl 实现一个多进程服务器(一) PHP多进程编程(一) PHP多进程编程(二)管道通信 我们知道,从父进程到子经常的数据传递相对比较容易一些,但是从子进程传递到父进程就比较的困难。 有很多办法实现进程交互,在php中比较方便的是 管道通信。当然,还可以通过 socket_pair 进行通信。 首先是服务器为了应对每一个请求要做的事情(发送一个url 序列,url序列用\t 分割。而结束标记是 \n) 代码 function clientHandle( $msgsock , $obj ) { $nbuf = '' ; socket_set_block( $msgsock ); do { if ( false === ( $buf = @socket_read( $msgsock , 2048 , PHP_NORMAL_READ))) { $obj -> error( " socket_read() failed: reason: " . socket_strerror(socket_last_error( $msgsock ))); break ; } $nbuf .= $buf ; if ( substr ( $nbuf , - 1 ) != " \n " ) { continue ; } $nbuf = trim (

PHP多进程初步

不羁岁月 提交于 2020-02-15 10:35:21
一、前言 我们都知道PHP是单线程执行,处理多并发主要是依赖服务器或PHP-FPM的多进程及它们进程的复用,但PHP实现多进程也意义重大,尤其是在后台Cli模式下处理大量数据或运行后台DEMON守护进程时。不能应用在Web服务器环境。 /** 检测是否CLI模式,确保这个函数只能运行在SHELL中 */ if (substr(php_sapi_name(), 0, 3) !== 'cli') {   die("cli mode only"); } 日常任务中,有时需要通过php脚本执行一些日志分析,队列处理等任务,当数据量比较大时,可以使用多进程来处理。 PHP的多线程也曾被人提及,但进程内多线程资源共享和分配的问题难以解决。PHP也有多线程想关的扩展 pthreads ,但据说不太稳定,且要求环境为线程安全,所用不多。 要实现PHP的多进程,需要安装 pcntl 和 posix 扩展。 二、创建子进程 使用 pcntl_fork() 函数可以在当前位置产生分支。fork 是创建了一个子进程,父进程和子进程都从 fork 的位置开始向下继续执行,不同的是父进程执行过程中,得到的 fork 返回值为子进程号,而子进程得到的是0,执行失败则返回-1。 因为系统初始init进程的pid为1,后来的所有进程pid都会大于该进程,所以可以通过 pcntl_fork()

php多进程pcntl学习(一)

三世轮回 提交于 2020-02-15 10:35:05
 上个月写的文章, php多进程pcntl学习(一) 现在发现并不完整,因为虽然提到了关闭子进程,但是并没有回收子进程,简单的说就是当子进程比父进程先退出,而父进程没对其做任何处理的时候,子进程将会变成僵尸进程。 <?php $ppid = getmygid(); $pid = pcntl_fork(); if ($pid == -1){ die('fork failed'); }else if($pid == 0){ $mypid = getmygid(); echo 'I am child process. My PID is ' . $mypid . ' and my father is',$ppid.PHP_EOL; exit(); //关闭子进程 ,需要配合pcntl_wait使用 , 否则通过ps aux | grep php - >[php] <defunct> 僵尸进程 }else{ echo 'Oh my god! I am a father now! My child is'. $pid . ' and mine is ' . $ppid . PHP_EOL; //pcntl_wait($status); //回收子进程,避免僵尸进程 } //使主进程挂起 sleep(100);   执行命令可以看见,子进程变为僵尸进程      僵尸进程虽然不占什么内存

php多进程实现

删除回忆录丶 提交于 2020-02-15 10:32:28
php多进程实现 PHP有一组进程控制函数(编译时需要–enable-pcntl与posix扩展),使得php能在nginx系统中实现跟c一样的创建子进程、使用exec函数执行程序、处理信号等功能。 CentOS 6 下yum安装php的,默认是不安装pcntl的,因此需要单独编译安装,首先下载对应版本的php,解压后 [plain] view plain copy print ? cd php-version/ext/pcntl phpize ./configure && make && make install cp /usr/lib/php/modules/pcntl.so /usr/lib64/php/modules/pcntl.so echo "extension=pcntl.so" >> /etc/php.ini /etc/init.d/httpd restart 方便极了。 下面是示例代码: [php] view plain copy print ? <?php header( 'content-type:text/html;charset=utf-8' ); // 必须加载扩展 if (!function_exists( "pcntl_fork")) { die( "pcntl extention is must !"); } //总进程的数量 $totals =

分享个人对多进程和多线程的理解

五迷三道 提交于 2020-02-06 12:30:04
php开发需要了解进程和线程,因为也会遇到多线程的开发。那什么是进程和线程呢?一起来唠唠吧。 内容概要: 1、什么是进程 2、什么是线程 3、进程和线程的关系 4、php编程常见的进程和线程 一、什么是进程 进程是程序执行是的一个实例,进程能够分配给cpu和内存等资源。进程一般包括指令集和系统资源,其中指令集就是你的代码,系统资源就是指cpu、内存以及I/O等。 二、什么是线程 线程是进程的一个执行流,线程不能分配系统资源,它是进程的一部分,比进程更小的独立运行的单位。 解释一下:进程有两个特性:一是资源的所有权,一个是调度执行(指令集),线程是调度执行中的一部分,是指进程执行过程的路径,也叫程序执行流。线程有时候也叫轻量级进程。 来源于《深入理解php内核》网站 三、进程和线程的关系 进程就像地主,有土地(系统资源),线程就像佃户(线程,执行种地流程)。每个地主(进程)只要有一个干活的佃户(线程)。 进程-资源分配的最小单位,相对健壮,崩溃一般不影响其他进程,但是切换进程时耗费资源,效率差些。 线程-程序执行的最小单位,没有独立的地址空间,一个线程死掉可能整个进程就死掉,但是节省资源,切换效率高。 四、php编程常见的进程和线程 1、在web应用中,我们每次访问php,就建立一个PHP进程,当然也会建立至少一个PHP线程。 2、PHP使用pcntl来进行多进程编程 3