返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP如何限制定时任务的进程数量
  • 306
分享到

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

2024-04-02 19:04:59 306人浏览 安东尼
摘要

前言 现在的工作中,经常要写一些脚本做一些异步的操作。 一般是大量的数据修改,或者解决部分并发问题。 为了能够稳定的做好数据处理,一般情况下会用定时脚本的方式。 那么问题来了。 可

前言

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

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

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

那么问题来了。

可能存在的问题

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

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

如何做

思路一

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

思路二

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

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

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

实践

思路一实践

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


<?PHP

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

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;
}


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限制进程数量内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: PHP如何限制定时任务的进程数量

本文链接: https://lsjlt.com/news/121994.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PHP如何限制定时任务的进程数量
    前言 现在的工作中,经常要写一些脚本做一些异步的操作。 一般是大量的数据修改,或者解决部分并发问题。 为了能够稳定的做好数据处理,一般情况下会用定时脚本的方式。 那么问题来了。 可...
    99+
    2024-04-02
  • PHP怎么限制定时任务的进程数量
    这篇文章主要介绍PHP怎么限制定时任务的进程数量,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!可能存在的问题当我们处理大量数据的时候,脚本的执行时间可能很长,或者重复处理某条数据(写错的情况下)。为了避免数据的重复处...
    99+
    2023-06-14
  • PHP中如何进行任务调度和定时任务?
    在Web开发中,很多网站和应用需要定期执行一些任务,比如清理垃圾数据、发送邮件等。为了自动化这些任务,开发人员需要实现任务调度和定时任务的功能。本文将介绍PHP中如何实现任务调度和定时任务,以及一些常用的第三方库和工具。一、任务调度任务调度...
    99+
    2023-05-14
    PHP 定时任务 任务调度
  • php如何实现定时任务
    这篇文章将为大家详细讲解有关php如何实现定时任务,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。php实现定时任务的方法:首先新建一个php文件;然后使用ignore_user_abort方法设置程序在浏...
    99+
    2023-06-15
  • php定时任务如何设置
    在PHP中设置定时任务可以通过以下几种方式来实现: 使用crontab命令:在Linux系统中,可以通过crontab命令来设置定...
    99+
    2024-04-02
  • php redis如何实现定时任务
    这篇文章主要介绍“php redis如何实现定时任务”,在日常操作中,相信很多人在php redis如何实现定时任务问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php redis如何实现定时任务”的疑惑有所...
    99+
    2023-07-04
  • 如何在PHP中使用定时任务函数
    PHP是一种非常流行的服务器端编程语言,它可以帮助我们开发高效、动态的Web应用程序。在编写Web应用程序时,我们经常需要执行一些定时任务,比如定期清理数据,自动发送邮件等等。 实现这些定时任务的一种方法是使用PHP的定时任务函数。在本文中...
    99+
    2023-05-19
    函数 PHP 定时任务
  • php如何实现定时任务,php定时任务方法,最佳解决方案,php自动任务处理
    定时任务对于php来说一直都是很多朋友的一个难题,但却很多地方都遇到了。 比如说: 游戏开发程序中,每隔10分钟给玩家发兵一次 sns社区中每隔20秒检测一下是否有人给我发消息 自动采集程序,每隔5分钟采集一次最新内容 微博数据同步,每隔1...
    99+
    2023-09-04
    php 服务器 开发语言
  • 如何在PHP中实现定时任务
    在现代的Web应用程序中,定时任务是至关重要的一环。它们可以帮助您在合适的时间自动化任务,如备份数据库,生成报告等。在PHP中实现定时任务是一件非常简单,可靠的任务,在本文中我们将介绍如何实现这一目标。在PHP中实现定时任务的第一步是创建一...
    99+
    2023-05-21
    PHP定时任务 时间计划任务 计划执行任务
  • CentOS7如何执行PHP定时任务详解
    前言 本文主要给大家介绍了关于CenomZhJTPtOS7执行php定时任务的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 一、CentOS 7 安装crontab: yum instal...
    99+
    2022-06-04
    centos 定时执行任务 php定时执行任务 服务器执行php任务
  • Linux如何定时执行任务教程
    目录1 教程1.1 安装crontabs1.2 查看crontab服务的状态:1.3 查看crontab的日志信息1.4 配置定时任务(1)修改定时任务:(2)查看定时任务1.5 crontab命令详解1.5.1 命令格...
    99+
    2023-04-23
    Linux定时任务教程 Linux定时任务 Linux任务
  • 如何实现PHP底层的定时任务调度
    实现PHP底层的定时任务调度文章摘要:无论是网站还是后台任务,在很多场景下都需要定时执行某些特定的操作,如发送邮件、数据备份等。PHP作为一种流行的开发语言,本身并没有内置的定时任务调度功能,但我们可以借助一些工具或者编写代码来实现定时任务...
    99+
    2023-11-08
    PHP定时任务 调度器 底层操作
  • 如何在PHP项目中实现定时任务和计划任务?
    如何在PHP项目中实现定时任务和计划任务?在开发一个PHP项目时,有时候需要执行一些定时任务或者计划任务。这些任务可能包括发送邮件、清理临时文件、生成报表等等。本文将介绍如何使用PHP来实现这些定时任务和计划任务。使用Crontab定时器C...
    99+
    2023-11-03
    PHP定时任务 PHP计划任务 项目中实现
  • oracle数据库如何设置定时任务
    在Oracle数据库中,可以使用以下两种方法设置定时任务:1. 使用Oracle的DBMS_SCHEDULER包:DBMS_SCHE...
    99+
    2023-09-14
    oracle数据库
  • oracle数据库定时任务如何创建
    oracle 数据库创建定时任务的方法:dbms_scheduler 包:创建作业、程序,将程序与作业关联,安排作业。作业调度程序:使用图形界面创建和管理定时任务。dbms_job 包:...
    99+
    2024-04-19
    oracle
  • Linux下进程数量的限制pid_max的配置方法
    这是在阅读另外一个产品的告警指导书时,无意中发现 pid_max 这个参数。 原来linux内核对于进程的数量使用 pid_max 做控制。 做一些简单的试验,如下演示获取当前配置值的方法: # cat /proc/...
    99+
    2022-06-04
    linux 进程数量 限制 linux pid_max
  • php-cgi进程cpu负载过高:禁用wordpress定时任务wp-cron.php
    一、问题描述 1、19号手动升级到wordpress4.1,21号早上7点看网站php探针,发现系统负载过高,差不多在1到1.5之间。 2、虽然对于双核处理器,这个值还可以接受,但是之间负载都只有0.2左右,而网站流量又...
    99+
    2022-06-12
    php-cgi cpu 负载
  • 如何配置Spring中的定时任务
    如何配置Spring中的定时任务?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。依赖以下两个包:<!-- 定时器依赖 开始 --> <dependen...
    99+
    2023-05-31
    spring
  • jQuery如何限制textarea的字符数量
    这篇文章主要介绍jQuery如何限制textarea的字符数量,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!限制textarea的字符数量jQuery.fn.maxLength = functio...
    99+
    2023-06-27
  • PHP如何进行定时查询数据刷新
    本文小编为大家详细介绍“PHP如何进行定时查询数据刷新”,内容详细,步骤清晰,细节处理妥当,希望这篇“PHP如何进行定时查询数据刷新”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、使用PHP实现定时器PHP提供...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作