0

0

如何使用PHP中pcntl和libevent实现Timer功能

不言

不言

发布时间:2018-06-15 15:28:45

|

1892人浏览过

|

来源于php中文网

原创

php 中实现timer功能,中间使用到了php多线程,本文给出来pcntl的解释。

PHP 使用pcntl和libevent 实现Timer功能,先看例子,pcntl(PHP线程)解释在下面。

 0) {  
    echo "master process exit\n";  
}

PHP 扩展pcntl 实现 ” 多线程 ”( 进程 )
pcntl 与 ticks
ticks 是通过 declare(ticks = n) {statement} 语法定义的 , declare 语法目前只能接受 ticks, 他定义的 ticks = n 的意义是当 declare 指定的语句块中执行了 N 条低级语句去发生一个事件 , 这个事件可以通过 register_tick_function($function_name) 来注册 .
pcntl 的信号机制是基于 ticks 机制实现的 . 因此 , 我们使用 pcntl 族函数中信号相关的函数时 , 需要在前面增加 declare(ticks = n) 语法结构 .
int pcntl_alarm(int $seconds):
$seconds 秒后向进程发送一个 SIGALRM 信号 , 每次调用 pcntl_alarm 方法都会取消之前设置的时钟 .
void pcntl_exec(string $path[, array $args[, array $env]]):
在当前进程空间执行一个程序 .
$path: 必须是二进制可执行文件 , 或具有有效脚本头信息 (#!/usr/local/bin/php) 的脚本文件路径 .
$args: 将要传递给该程序的字符串参数列表 ( 数组形式 )
$envs: 环境变量 . 以数组 (key => value 形式 ) 方式传递给要执行程序的环境变量 .
int pcntl_for k (void):
创建一个子进程 , 该子进程与父进程仅仅是 PID( 进程号 ) 和 PPID( 父进程号 ) 不同 .
在父线程执行时返回创建的子进程 pid, 在子线程执行时返回 0, 创建子进程失败时会在父进程上下文返回 -1, 并引发 php 错误 .
理解这里的 fork 需要知道 : pcntl_fork 创建的是一个分支节点 , 相当于一个标记 , 父进程完成后 , 子进程会从标记处继续执行 , 也就是说 pcntl_fork 后面的代码分别被父进程和子进程执行了两遍 , 而两个进程在执行过程中得到的返回值是不同的 . 因此 , 才可以分离父子进程执行不同的代码 .
int pcntl_getpriority([int $pid = getmypid()[, int $process_identifier = PRIO_PROCESS]]):
获取给定 $pid 对应的进程的优先级 , 默认是通过 getmypid() 获取到的值也就是当前进程 .
$pid: 如果没有指定 , 默认是当前进程 .
$process_identifier: PRIO_PGRP, PRIO_USER, PRIO_PROCESS 三者之一 , 默认 PRIO_PROCESS. 其中 PRIO_PGRP 指获取进程组的优先级 , PRIO_USER 指获取用户进程的优先级 , PRIO_PROCESS 指获取特定进程优先级 .
返回进程的优先级 , 或者在发生错误时返回 false, 值越小说明越优先
bool pcntl_setpriority(int $priority[, int $pid = getmypid()[, int $process_identifier = PRIO_PROCESS]]:
设置进程的优先级 .
$priority: 优先级值 , -20 到 20 的范围内 , 默认优先级为 0.   值越小说明越优先 .
$pid: 如果没有指定 , 指当前进程
$process_identifier: 意义同 pcntl_getpriority 的 $process_identifier.
设置成功返回 TRUE, 失败返回 FALSE.
bool pcntl_signal_dispatch(void):
调用通过 pcntl_signal() 安装的即将发生的信号的处理器 .
调用成功返回 TRUE, 失败返回 false.
php 5.3.3 加入
bool pcntl_signal(int $signo, callback $handler[, bool $restart_syscalls = true]):
为指定的信号 $signo 安装一个新的信号处理器 $handler.
最后一个参数不明白意义 .
bool pcntl_sigprocmask(int $how, array $set[, array &$oldset]):
增加 , 删除或设置锁信号 , 具体的行为依赖于 $how 参数
$how: SIG_BLOCK 用于把信号增加到当前锁信号中 , SIG_UNBLOCK 用于把信号从当前锁信号中移除 , SIG_SETMASK 用于用给定的信号列表替换当前锁信号 .
$set: 要增加 , 移除或设置的信号列表 .
$oldset: 用于向调用者返回旧的锁定信号 .
成功返回 TRUE, 失败返回 FALSE.
int pcntl_sigtimedwait(array $set[, array &$siginfo[, int $seconds = 0[, int $nanoseconds = 0]]]):
pcntl_sigtimedwait 实际上和 pcntl_sigwaitinfo() 所做的是同样的事情 , 不过 pcntl_sigtimedwait 多了两个增强的参数 $seconds 和 $nanoseconds, 这样就允许脚本的停留时间有一个上限而不是无限制等待 .
$set: 需要等待的信号列表
$siginfo: 用来向调用者返回等待得到的信号的信息 , 信息内容见 pcntl_sigwaitinfo
$seconds: 超时的秒数
$nanoseconds: 超时的纳秒数
成功后 , pcntl_sigtimedwiat() 返回信号编号
int pcntl_sigwaitinfo(array $set[, array &$siginfo]):
挂起当前脚本的执行 , 直到接受到 $set 中的某个信号 , 如果其中的一个信号将要到达 ( 比如被 pcntl_sigprocmask 锁定 ) 那么 pcntl_sigwaitinfo 将会立刻返回
$set: 等待的信号列表
$siginfo: 用来向调用者返回等待得到的信号的信息 , 该信息包含以下内容 :
1.       所有信号都有以下三个信息 :
a)        signo: 信号编号
b)        errno: 错误号
c)         code: 信号代码
2.       SIGCHLD 信号特有的信息
a)        status: 退出的值或信号
b)        utime: 用户消耗时间
c)         stime: 系统消耗时间
d)        pid: 发送进程 id
e)        uid: 发送进程的真实用户 id
3.       SIGILL, SIGFPE, SIGSEGV, SIGBUS 拥有的信息
a)        addr: 产生故障的内存位置
4.       SIGPOLL 特有的信息 :
a)        band: band event, 意义未知
b)        fd: 文件描述符
函数成功运行返回信号编号
int pcntl_wait(int &$status[, int *options = 0]):
挂起当前进程直到一个子进程退出或直到一个信号要求终止当前进程或调用一个信号处理函数 . 如果子进程在调用时已经退出 ( 俗称成为了僵尸进程 ), 此函数会马上返回 , 所有的系统资源都将被释放 .
$status 用来保存子进程的状态信息 , 该状态信息由以下函数产生 : pcntl_wifexited, pcntl_wifstopped, pcntl_wifsignaled, pcntl_wexitstatus, pcntl_wtermsig, pcntl_wstopsig.
$options: 如果你的系统允许 wait3( 大多数的 BSD 类系统 ), 你可以提供一个可选的 options 参数 , 如果不提供这个参数 , wait 将会使用系统调用 , 如果系统不允许 wait3, 提供这个参数不会有任何影响 , $options 的值可以是 0 或者 WNOHANG 和 WUNTRACED 两个常数 .
函数返回退出的子进程的 PID, 或在错误时返回 -1, 或者如果提供 WNOHANG 作为 option(wait3 不可用的系统 ) 并且无有效子进程返回 0
僵尸进程 : 由于父进程在 fork 之后 , 无法预知子进程什么时候结束 , 所以子进程为了要留给父进程一些信息 , 会留下一个称作僵尸的数据结构 , 等待由父进程发起 wait 的操作来为它收尸 , 在子进程结束 ( 逻辑结束 ) 到父进程收尸前这一段时间子进程就被称为僵尸进程 , 在父进程结束后 , 所有的子进程会交由 Init 来负责 , 因此 , 如果父进程结束 , 僵尸进程都会被回收 , 但是 , 如果父进程永远不结束 , 这些僵尸进程就一直占用进程号 , 如果系统进程号耗尽 , 那么将导致无法启动新进程 , 因此 , 安全的做法是在父进程中为自己产生的子进程去收尸 .
int pcntl_waitpid(int $pid, int &$status[, int $options = 0]):
挂起当前进程直到给定 $pid 的子进程退出 , 或者当前进程接受到一个退出信号 , 或者接受到一 ige 信号去调用一个信号处理器 .
如果给定 $pid 对应的子进程在调用此函数时已经退出 ( 僵尸态 ), 函数立刻返回 , 所有的系统资源被释放 .
$pid: 进程号 , 小于 -1 表明等待的是进程组中的任何子进程 , 进程组号就是 $pid 的绝对值 . 等于 -1 表明等待任意紫禁城 , 与 pcntl_wait 函数行为一致 . 等于 0 代表等待与调用进程在同一组的子进程 , 大于 0 代表是特定的进程 .
$status: 用来由函数返回子进程状态 . 该状态信息由以下函数产生 : pcntl_wifexited, pcntl_wifstopped, pcntl_wifsignaled, pcntl_wexitstatus, pcntl_wtermsig, pcntl_wstopsig.
$options: 与 pcntl_wait 的 $options 意义相同
int pcntl_wexitstatus(int $status):
返回一个已经中断的子进程返回代码 , 此函数仅在 pcntl_wifexited 函数返回 TRUE 时有用 .
$status 参数是 pcntl_waitpid 产生的状态信息 .
bool pcntl_wifexited(int $status):
检查给定状态是否表明子进程是正常退出的 .
bool pcntl_wifsignaled(int $status):
检查给定状态是否表明子进程是由于收到某个信号退出的 .
bool pcntl_wifstopped(int $status):
检查 $status 是否能表明子进程当前已经停止 , 这个函数只有在作用于 pcntl_waitpid 函数使用的 WUNTRACED 作为 $options 参数的值时产生的 $status 上才有效 .
int pcntl_wstopsig(int $status):
通过分析 $status 返回使得子进程停止的信号的编号 , 这个函数只有在 pcntl_wifsignaled 返回 TRUE 时才有效 .
int pcntl_wtermsig(int $status):
返回使进程中断的信号编号 . 这个函数只有在 pcntl_wifsignaled 返回 TRUE 时才有效 .

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

立即学习PHP免费学习笔记(深入)”;

dmSOBC SHOP网店系统
dmSOBC SHOP网店系统

dmSOBC SHOP网店系统由北京时代胜腾信息技术有限公司(http://www.webzhan.com)历时6个月开发完成,本着简单实用的理念,商城在功能上摒弃了外在装饰的一些辅助功能,尽可能的精简各项模块开发,做到有用的才开发,网店V1.0.0版本开发完成后得到了很多用户的使用并获得了好评,公司立即对网店进行升级,其中包括修正客户提出的一些意见和建议,现对广大用户提供免费试用版本,如您在使用

下载

PHP取整函数之ceil,floor,round,intval的区别解析

如何使用PHP中curl模拟post上传及接收文件

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

543

2023.08.02

curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

445

2023.06.14

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

178

2023.10.30

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

381

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

213

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1505

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

626

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

738

2024.03.22

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

19

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 10.9万人学习

HTML教程
HTML教程

共500课时 | 5.3万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号