PHP如何限制定时任务的进程数量

 更新时间:2021年03月19日 09:28:25   作者:菜鸟寻出路  
这篇文章主要给大家介绍了关于PHP如何限制定时任务进程数量的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

现在的工作中,经常要写一些脚本做一些异步的操作。

一般是大量的数据修改,或者解决部分并发问题。

为了能够稳定的做好数据处理,一般情况下会用定时脚本的方式。

那么问题来了。

可能存在的问题

当我们处理大量数据的时候,脚本的执行时间可能很长,或者重复处理某条数据(写错的情况下)。

为了避免数据的重复处理、运行脚本过多导致服务器压力过大等问题,我们需要限制脚本的运行数量。

如何做

思路一

查询某种标识的进程数量,如果超过一定数量,则直接退出,不处理。

思路二

记录每次的PID,可以使用 文件、redis、memcached 等来存储。

当启动一个新进程的时候,去查一下这个标识下面有哪些PID,是否还在运行,且与当前标识有关系。

当超过一定数量的时候,直接退出,不处理。

实践

思路一实践

这里通过 linux 的 ps、grep、wc 的命令来获取指定标识的运行进程数。

<?php
/**
 * 是否可以运行
 *
 * @param string $ident 标识
 * @param integer $maxNum 最大运行数量
 *
 * @return bool
 */
function canRun($ident, $maxNum)
{
  $cmd = sprintf('ps ax | grep %s | grep -v /bin/sh | grep -v grep | wc -l', $ident);
  $fp = @popen($cmd, 'r');
  $num = (int)trim(@fread($fp, 2096));
  @pclose($fp);
  return $num <= $maxNum;
}

思路二实践

这里使用 redis 存储 pid 信息。

通过 /proc/{pid}/cmdline 文件检测指定进程是否还在运行。

<?php
/**
 * 检查 pid 是否存活
 *
 * @param string $pid  PID
 * @param string $ident 标识
 *
 * @return bool
 */
function isSurvive($pid, $ident)
{
  // 获取指定pid的cmdline文件
  $cmdlinePath = sprintf('/proc/%s/cmdline', $pid);
  if (!is_file($cmdlinePath)) {
   return false;
  }
  $cmdline = trim(file_get_contents($cmdlinePath));
  // 检查标识是否在 cmdline 中
  return strpos($cmdline, $ident) !== false;
}

/**
 * 是否可以运行
 *
 * @param string $ident 标识
 * @param integer $maxNum 最大运行数量
 *
 * @return bool
 */
function canRun($ident, $maxNum)
{
  // 假设已经链接上
  $redisHandler = getRedis();
  // 定义一个key
  $key = sprintf('php:job:%s:pid', $ident);
  // 当前的PID
  $currentPid = getmypid();
  // 将当前的PID写入redis
  $redis->sAdd($key, $currentPid);
  // 获取redis中的所有pid
  $pids = $redis->sMembers($key);
  // 遍历pid,检查是否有效
  foreach ($pids as $index => $pid) {
    if ($currentPid == $pid) {
      continue;
    }
    // 检查 pid 是否还在运行中
    if (isSurvive($pid, $ident)) {
      continue;
    }
    // 若不再运行,则直接删除
    unset($pids[$index]);
    $redis->sRemove($key, $pid);
  }
  return count($pids) <= $maxNum;
}


关于标识

关于标识,可能我们在运行一些定时脚本的时候,统一的部分可能就是 php 了;或者,拥有相同标识的脚本,我们要归为几类。

为了能够实现这些需求,我们可以通过 php 的内置函数 cli_set_process_title 来实现自定义 COMMAND。
demo.php:

这个时候,我们运行 demo.php,然后通过 ps ax 可以看到如下结果:

PID  USER   TIME COMMAND
  1 root   0:09 php-fpm: master process (/usr/local/etc/php-fpm.conf)
  7 root   0:16 php-fpm: pool www
  8 root   0:15 php-fpm: pool www
  9 root   0:14 php-fpm: pool www
  10 root   0:00 sh
 663 root   0:00 sh
 690 root   0:00 {php} Job Demo
 691 root   0:00 ps ax

修改指定脚本的进程标题,我们就可以实现定义某些脚本的标识了。

最后

没 BUG 的功能,也可能出现 BUG,我们需要更多的思考和设计减少这类错误的发生。

到此这篇关于PHP如何限制定时任务进程数量的文章就介绍到这了,更多相关PHP限制进程数量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PHP常用函数之base64图片上传功能详解

    PHP常用函数之base64图片上传功能详解

    这篇文章主要介绍了PHP常用函数之base64图片上传功能,结合实例形式分析了前台ajax提交及后台base64图片编码上传相关操作技巧,需要的朋友可以参考下
    2019-10-10
  • 七种PHP开发环境搭建工具

    七种PHP开发环境搭建工具

    这篇文章主要介绍了七种PHP开发环境搭建工具,帮助开发小白更好的学习PHP,文中推荐的工具都很实用,感兴趣的朋友可以了解下
    2020-06-06
  • 学习php设计模式 php实现策略模式(strategy)

    学习php设计模式 php实现策略模式(strategy)

    这篇文章主要介绍了php设计模式中的适配器模式,使用php实现适配器模式,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • PHP中加密解密函数与DES加密解密实例

    PHP中加密解密函数与DES加密解密实例

    这篇文章主要介绍了PHP中加密解密函数与DES加密解密,以实例形式分析了常用的PHP加密解密算法encrypt与DES加密解密的原理及应用方法,非常具有实用价值,需要的朋友可以参考下
    2014-10-10
  • 解析PHP生成静态html文件的三种方法

    解析PHP生成静态html文件的三种方法

    本篇文章是对PHP生成静态html文件的三种方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • PHP使用缓存即时输出内容(output buffering)的方法

    PHP使用缓存即时输出内容(output buffering)的方法

    这篇文章主要介绍了PHP使用缓存即时输出内容(output buffering)的方法,实例分析了php缓存输出的相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • 基于PHP的微信公众号的开发流程详解

    基于PHP的微信公众号的开发流程详解

    这篇文章主要介绍了基于PHP的微信公众号的开发流程详解,文章通过示例代码和服务器及菜单配置的图文讲解介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 小谈php正则提取图片地址

    小谈php正则提取图片地址

    最近在开发程序的时候需要获取提取内容中的图片地址,这里简单分享下方法,需要的朋友可以参考下
    2014-03-03
  • phpmyadmin显示utf8_general_ci中文乱码的问题终级篇

    phpmyadmin显示utf8_general_ci中文乱码的问题终级篇

    自己写PHP也有一年多了,然后编码问题却老是没有得到好的解决,自己的情况是这样的,网页显示完全正常,在phpmyadmin数据库显示中文乱码,不管是简体还是繁体,只要是中文都是乱码
    2013-04-04
  • PHP实现页面跳转的多种方法

    PHP实现页面跳转的多种方法

    PHP被许多程序员用来开发WEB的首选语言,在实际开发中,网站的各项功能都可以通过PHP语言的编写来满足,比如PHP页面跳转这一方法,本文给大家介绍了PHP实现页面跳转的多种方法,需要的朋友可以参考下
    2024-10-10

最新评论