在以往的开发项目中,要操作进程就会使用PHP自带的pcntl拓展。但是pcntl存在着许多的不足:

  • pcntl没有提供进程间通信的功能
  • pcntl不支持重定向标准输入和输出
  • pcntl只提供了fork这样原始的接口,容易使用错误

这边我们使用swoole进程管理模块,用来替代PHPpcntl

场景:日常任务中,有时需要通过php脚本执行一些日志分析,队列处理等任务,当数据量比较大时,可以使用多进程来处理。

准备:安装PHP_swoole拓展;

write($data)

  向管道内写入数据。$data的长度在Linux系统下最大不超过8KMacOS/FreeBSD下最大不超过2K

start():

   执行fork调用,启动子进程。

/** 创建子进程,将数据写入管道,然后启动子进程 */
$process = new \swoole_process([$this, 'sonProcessWork']);
$process->write(json_encode($data_pop));
$pid = $process->start();

swoole_event_add():  将一个socket加入到底层的reactor事件监听中;在子进程中处理一些耗时的计算或者操作;

/** 获取管道的业务数据,进行相关的操作 */
public function sonProcessWork(\swoole_process $worker){
  $GLOBALS['worker'] = $worker;
  swoole_event_add($worker->pipe, function($pipe) {
   /******start*你的业务逻辑 *******/
    .....
   /******end*你的业务逻辑 *******/
  $worker->exit(0);
  })
}

wait(false)

  回收结束运行的子进程

/** 根据信号处理紫禁城 */
private function sig_handler($signo) { 
 Process::signal(SIGCHLD, function($sig) {
//必须为false,非阻塞模式
while($ret = Process::wait(false)) {
echo "PID={$ret['pid']}\n";
}
});

}

以上就是php_swoole 对进程的基本操作,在实际开发过程中,业务会比较复杂;我们应当配合队列来进行使用。下一章节我们讲解 swoole+redis对列来进行批量发送短信的功能,并记录每条短信发送状态和记录发送日志;

PHP操作多进程的更多相关文章

  1. Python进阶【第二篇】多线程、消息队列queue

    1.Python多线程.多进程 目的提高并发 1.一个应用程序,可以有多进程和多线程 2.默认:单进程,单线程 3.单进程,多线程 IO操作,不占用CPU python的多线程:IO操作,多线程提供并 ...

  2. JNI总结(一)

    JNI 是 Java平台中的一个强大特性.应用程序能够通过 JNI把 C/C++代码集成进 Java程序中.通过 JNI.开发人员在利用 Java平台强大功能的同一时候,又不必放弃对原有代码的投资.由 ...

  3. Python并发式编程

    目录 进程 线程 GIL(Global Interpreter Lock) 线程的调用方式 直接调用 继承调用 join&Daemon方法 Daemon(True) 同步锁 死锁 递归锁 同步 ...

  4. python网络进阶篇

    并发编程 进程 操作系统的历史 # 手工操作 —— 穿孔卡片 # 程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数 ...

  5. Python-全局解释器锁GIL原理和多线程产生原因与原理-多线程通信机制

    GIL 全局解释器锁,这个锁是个粗粒度的锁,解释器层面上的锁,为了保证线程安全,同一时刻只允许一个线程执行,但这个锁并不能保存线程安全,因为GIL会释放掉的并且切换到另外一个线程上,不会完全占用,依据 ...

  6. Linux 和 Windows 下实现多进程的方式以及管道操作

    一.多进程 1.windows 多进程 使用 #include<windows.h> 下面的 BOOL CreateProcess( LPCWSTR pszImageName, LPCWS ...

  7. C#使用互斥量(Mutex)实现多进程并发操作时进程间的同步操作(进程同步)

    本文主要是实现操作系统级别的进程同步的代码及测试结果,代码经过测试,可直接使用,也可供参考. 承接上一篇博客的业务场景[C#使用读写锁三行代码简单解决多线程并发写入文件时线程同步的问题]. 随着服务进 ...

  8. Python多进程操作同一个文件,文件锁问题

    最近工作当中做了一个项目,这个项目主要是操作文件的. 在操作耗时操作的时候,我们一般采用多线程或者多进程.在开发中,如果多个线程需要对文件进行读写操作,就需要用到线程锁或者是文件锁. 使用fcntl ...

  9. C#使用互斥量(Mutex)实现多进程并发操作时多进程间线程同步操作(进程同步)的简单示例代码及使用方法

    本文主要是实现操作系统级别的多进程间线程同步(进程同步)的示例代码及测试结果.代码经过测试,可供参考,也可直接使用. 承接上一篇博客的业务场景[C#使用读写锁三行代码简单解决多线程并发写入文件时线程同 ...

随机推荐

  1. JS练习:表格全选与全不选

    代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...

  2. Linux之iptables(三、命令--->单主机)

    iptables命令规则格式: iptables [-t table] SUBCOMMAND chain [-m matchname[per-match-options]] -j targetname ...

  3. Linux - VMware和Centos安装

    目录 Linux - VMware和Centos安装 选择性 下载centos系统ISO镜像 安装虚拟机VMware虚拟机 1. 准备vmware软件 2. 解压软件包, 当前选择vm12 3. vm ...

  4. jdk8--十大新特性

    https://www.cnblogs.com/dennyzhangdd/p/6722445.html 一.十大特性 1.Lambda表达式 2.Stream函数式操作流元素集合 3.接口新增:默认方 ...

  5. 创建序列化器,序列化管理器,closureSerializer

    创建序列化器,序列化管理器,closureSerializer //通过反射创建序列化对象 // Create an instance of the class with the given name ...

  6. E - Period

    For each prefix of a given string S with N characters (each character has an ASCII code between 97 a ...

  7. kendo grid create

    这种自定义的create中的函数,这个data的行为是在发送到后端之前执行的 //{ // url: "/admgr/AdUserAuthorityAdd", // dataTyp ...

  8. hibernate即时获取数据库信息

    由于读取数据的时候,Hibernate将第一次读取的内容放到了缓存中,若此时有别的应用修改了数据库中的数据,程序再次读取的时候,内容是从缓存中直接获取,无法反映数据库中的最新状况. 因此,可以设置读取 ...

  9. N天学习一个Linux命令之hostnamectl

    前言 安装了CentOS7,发现按照以前修改文件/etc/sysconfig/network HOSTNAME字段主机名的方式不生效了,查资料发现可以使用hostnamectl命令 用途 Contro ...

  10. PHP array_key_exists()

    定义和用法 array_key_exists() 函数判断某个数组中是否存在指定的 key,如果该 key 存在,则返回 true,否则返回 false. 语法 array_key_exists(ke ...