SimpleFork
simple-fork-php 是基于 PCNTL 扩展的进程管理包,接口类似与 Java 的 Thread 和 Runnable
为什么要写 SimpleFork
多进程程序的编写相比较多线程编写更加复杂,需要考虑进程回收、同步、互斥、通信等问题。对于初学者来说,处理上述问题会比较困难。 尤其是信号处理和进程通信这块,很难做到不出问题。 SimpleFork提供一套类似于JAVA多线程的进程控制接口,提供回收、同步、互斥、通信等方案,开发者可以关注业务问题,不需要过多考虑进程控制。
引入
composer require jenner/simple_fork
require path/to/SimpleFork/autoload.php
依赖
必须
ext-pcntl 进程控制
可选
ext-sysvmsg 消息队列
ext-sysvsem 同步互斥锁
ext-sysvshm 共享内存
特性
提供进程池
自动处理僵尸进程回收,支持无阻塞调用
提供共享内存、System V 消息队列、Semaphore锁,方便IPC通信(进程通信)
提供Process和Runnable两种方式实现进程
可以实时获取到进程状态
shutdown所有进程或单独stop一个进程时,可以注册覆盖beforeExit()方法,返回true则退出,false继续运行(在某些场景,进程不能立即退出)
支持子进程运行时reload
注意事项
System V 消息队列由于在程序退出时可能存在尚未处理完的数据,所以不会销毁。如果需要销毁,请调用$queue->remove()方法删除队列
共享内存会在所有进程退出后删除
Semaphore对象会在对象回收时进行销毁
进程池start()后,需要调用wait()进行僵尸进程回收,可以无阻塞调用
获取进程状态(调用isAlive()方法)前,最好调用一个无阻塞的wait(false)进行一次回收,由于进程运行状态的判断不是原子操作,所以isAlive()方法不保证与实际状态完全一致
如果你不清楚在什么情况下需要在程序的最开始加入declare(ticks=1);,那么最好默认第一行都加入这段声明。
如何使用declare(ticks=1);
declare(ticks=1); 这段声明用于进程信号处理。如果注册了信号处理器,程序会没执行一行代码后自动检查是否有尚未处理的信号。http://php.net/manual/zh/control-structures.declare.php
TODO
提供更多功能的进程池,模仿java
提供第三方进程通信机制(Redis等)
更多的测试及示例程序
示例程序
更多示例程序见exmples目录
simple.php
class TestRunnable extends \Jenner\SimpleFork\Runnable{ /**
* 进程执行入口
* @return mixed
*/ public function run() { echo "I am a sub process" . PHP_EOL;
}
} $process = new \Jenner\SimpleFork\Process(new TestRunnable()); $process->start();
shared_memory.php
class Producer extends \Jenner\SimpleFork\Process{ public function run(){ for($i = 0; $i<10; $i++){ $this->cache->set($i, $i); echo "set {$i} : {$i}" . PHH_EOL;
}
}
} class Worker extends \Jenner\SimpleFork\Process{ public function run(){
sleep(5); for($i=0; $i<10; $i++){ echo "get {$i} : " . $this->cache->get($i) . PHP_EOL;
}
}
} $memory = new \Jenner\SimpleFork\IPC\SharedMemory(); $producer = new Producer(); $producer->setCache($memory); $worker = new Worker(); $worker->setCache($memory); $pool = new \Jenner\SimpleFork\Pool(); $pool->submit($producer); $pool->submit($worker); $pool->start(); $pool->wait();
SimpleFork 英文README.MD 基于PCNTL扩展的多进程控制框架,接口类似与Java的Thread和Runnable 最新版本见英文版 为什么要写SimpleFork 多进程程序的编写相比较多线程编写更加复杂,需要考虑进程回收、同步、互斥、通信等问题。对于初学者来说,处理上述问题会比较困难。 尤其是信号处理和进程通信这块,很难做到不出问题。 SimpleFork提供一套类似于JAV
软件介绍 SimpleFork simple-fork-php 是基于 PCNTL 扩展的进程管理包,接口类似与 Java 的 Thread 和 Runnable 为什么要写 SimpleFork 多进程程序的编写相比较多线程编写更加复杂,需要考虑进程回收、同步、互斥、通信等问题。对于初学者来说,处理上述问题会比较困难。 尤其是信号处理和进程通信这块,很难做到不出问题。 SimpleFork提供一
此部分源码; https://gitee.com/shanhubei/vue-file-uploader 使用vue-simple-uploader上传文件和文件夹 文件上传在项目中应用广泛,尤其类似网盘上传文件的应用,需要批量上传文件、文件夹、秒传、断点续传等功能,那么有一款基于vue的前端上传组件可以满足。这是一个非常强大的文件上传组件,它叫vue-simple-uploader。 该系列文章
前言 为了阅读和开发方便,我将近期计划要发布的文件上传系列相关文章章节列出来: 该系列文章涉及到知识范围有前端vue,后端PHP,Mysql,Redis,Swoole等。 介绍vue-simple-uploader vue-simple-uploader就是一个基于 simple-uploader.js 和Vue结合做的一个上传组件,自带 UI,可覆盖、自定义。它支持文件、多文件、文件夹上传;支持
SimpleFork 项目地址:https://github.com/huyanping/simple-fork-php 基于PCNTL扩展的多进程进程并发框架,接口类似与Java的Thread和Runnable 为什么要写SimpleFork 多进程程序的编写相比较多线程编写更加复杂,需要考虑进程回收、同步、互斥、通信等问题。对于初学者来说,处理上述问题会比较困难。 尤其是信号处理和进程通信这块
simple-uploader.js(也称 Uploader)是一个上传库,支持多并发上传,文件夹、拖拽、可暂停继续、秒传、分块上传、出错自动重传、手工重传、进度、剩余时间、上传速度等特性;该上传库依赖 HTML5 File API。由于是分块上传,所以依赖文件的分块 API,所以受限于此浏览器支持程度为:Firefox 4+, Chrome 11+, Safari 6+ and Internet
Soli Process 基于 pcntl 和 posix 扩展,简单的 PHP 多进程管理类库。 依赖 Unix-like PHP 5.0+ ext-pcntl ext-posix 注:信号处理部分需要 PHP 7.1+ 安装 使用 composer 进行安装: composer require soliphp/process 快速使用 use Soli\Process; include __D
The following exemple works with php5.6 and apcu. This was tested on debian 7 and Ubuntu 14.04.2 LTS. Here is a proposition of a simple Job class which execute a task list upon a item queue with share
PHP bindings for Go 这个包实现了对执行PHP脚本、导出Go变量以便在PHP上下文中使用、将Go方法接收器附加为PHP类以及返回PHP变量以便在Go上下文中使用的支持。 支持PHP 5.x and PHP 7.x 编译 构建这个包需要将PHP作为库安装。对于大多数Linux系统,这通常可以在“php-embed”包或其变体中找到。 确保PHP库可用,就可以使用“go build”
1. PHP的所有应用程序都是通过WEB服务器(如IIS,Nginx或Apache)和PHP引擎程序解释执行完成的,工作过程: (1)当用户在浏览器地址中输入要访问的PHP页面文件名,然后触发一个web请求,并将请求传送到WEB服务器。 (2)WEB服务器接受这个请求,并根据其后缀进行判断是一个PHP请求,WEB服务器从硬盘或内存中调出用户要访问的PHP应用程序,并将其发送给PHP引擎程序。 (3
vm上有一个php72现编译一个56,不知道service启动文件怎么写,经过一番baidu,终于写出,贴一下参数 通过自己总结写出 贴一下我的博客https://vwlin.top/index.php/archives/68/ ```bash [Unit] Description=The PHP56 FastCGI Process Manager After=syslog.target
The Simple CTF Background 2017年为了给社团成员做一个看起来还说得过去的CTF平台,所以就随便写了一下,不过没想到最后还成了一个有意思的小玩意,页面看起来比较简陋,也没有用什么框架之类的,所以代码显得很多,以后会尝试去重构代码。采用 html + ajax 动态刷新页面,大部分js、css采用 BootCDN ,所以访问速度较快。 Install 安装方法很简单,除了
⚠️ NUDE PICS!!!, KEEP READING! ⚠️ Now that I got your attention, let me tell you something about this repo. This repo needs some love I forked this this repo from sourceforge long time ago just to inc
1. 什么是Fork/Join框架 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。 我们再通过Fork和Join这两个单词来理解下Fork/Join框架,Fork就是把一个大任务切分为若干子任务并行的执行,Join就是合并这些子任务的执行结果,最后得到这个大任务的结果。比如计算1+2+。。+1
我正在开发应用程序(Matt的traceroute windows版本http://winmtr.net/),它创建了多线程,每个线程都有自己的进程(执行ping命令)。 使用阻塞队列(在任务执行之前保留任务) 平丝。JAVA 现在如果我创建多个线程,比如在一个循环中超过500个线程,并在池执行器中执行 执行线程 我确实知道LinkedBlockingQueue在执行任务之前持有任务。每个线程的进
无法理解为什么Fork-Join在多核利用方面更好。 举例说明(仅为理论): 我有一个Web服务endpoint数组:[E1、E2、E3、E4] 假设每个endpoint都返回一个数字。 然后我必须总结总数并返回结果。 记住这个简单的故事。 我有两个选择: ExecutorService修复了4个线程池,并并行跨越这4个调用 假设我有4个核。 有了Executor service,就可以创建4个J
问题内容: 使用新的fork / join框架 有什么好处,而不是仅在开始时将大任务简单地拆分为N个子任务,然后将它们发送到缓存的线程池(来自Executors),然后等待每个任务完成?我看不到使用fork / join抽象如何简化问题或使解决方案比我们多年以来的效率更高。 例如,本教程示例中的并行化模糊算法可以这样实现: 首先拆分,然后将任务发送到线程池: 任务进入线程池的队列,当工作线程可用时
这个文档描述了Chromium的高层架构 问题 构建一个从不会挂起或崩溃的渲染引擎几乎是不可能的。构建一个完全安全的渲染引擎也是几乎不可能的。 在某种程度上,web浏览器当前状态就像一个与过去的多任务操作系统合作的单独的用户。正如在一个这样的操作系统中的错误程序会让整个系统挂掉,所以一个错误的web页面也可以让一个现代浏览器挂掉。仅仅需要一个浏览器或插件的bug,就饿能让整个浏览器和所有正在运行的
多线程 多线程(multiple thread)是计算机实现多任务并行处理的一种方式。 在单线程情况下,计算机中存在一个控制权,并按照顺序依次执行指令。单线程好像是一个只有一个队长指挥的小队,整个小队同一个时间只能执行一个任务。 单线程 在多线程情境下,计算机中有多个控制权。多个控制权可以同时进行,每个控制权依次执行一系列的指令。多线程好像是一个小队中的成员同时执行不同的任务。 可参考Linux多
本文向大家介绍Java 线程池框架,包括了Java 线程池框架的使用技巧和注意事项,需要的朋友参考一下 一、线程池结构图 二、示例 定义线程接口 1:newSingleThreadExecutor 输入结果: 2:newFixedThreadPool 输入结果: 3 :newCachedThreadPool 输入结果: 4 :ScheduledThreadPoolExecutor 输入结果: 三、
本文向大家介绍Python多进程fork()函数详解,包括了Python多进程fork()函数详解的使用技巧和注意事项,需要的朋友参考一下 进程 进程是程序的一次动态执行过程,它对应了从代码加载、执行到执行完毕的一个完整过程。进程是系统进行资源分配和调度的一个独立单位。进程是由代码(堆栈段)、数据(数据段)、内核状态和一组寄存器组成。 在多任务操作系统中,通过运行多个进程来并发地执行多个任务。由于