PHP 并发控制样例(转)

php并发解决案例(代码) 本案例前端采用并发发出curl请求,服务端采用文件锁机制,而且系统锁机制与逻辑锁机制并存,使得在并发的情况下,系统不阻塞!----这是本人花了一天多时间弄出来,属于原创! 立即下载

值得参考一下该程序设计的思路:

[文章作者:张宴 本文版本:v1.0 最后修改:2007.11.16 转载请注明出处:http://blog.s135.com]

  最近遇到一个问题,Linux下的PHP命令行程序作为守护进程,需要从队列文件中读一行数据,通过TCP协议发送给外地的接收服务器,再读下一行数据,再发送。当本地与外地的网络状况不好时,有时候发送一条数据所耗费的时间就较长,累积起来容易造成队列堵塞和延迟。

  于是,我准备用该PHP命令行程序生成多个子进程,将串行处理变成并行处理。最简单的方法就是在PHP中用exec()或popen()函数将一个shell命令行推到后台去执行,例如:

<?php
exec("/bin/sh /opt/zhangyan.sh &");
?>

  最后的&表示将shell脚本推到后台去执行。

  但是这样会有一个问题,如果推到后台的进程太多,可能会导致服务器系统资源耗尽而崩溃,所以必须控制进程数量。



  我写了一个PHP程序(/opt/zhangyan.php)、一个shell程序(/opt/zhangyan.sh)作为测试用例。

  程序的逻辑:
  1、设置/opt/zhangyan.php最多允许生成500个子进程;
  2、当/opt/zhangyan.php读取到一条数据后,将允许生成的子进程数减1(空闲进程数$p_number=500-1=499),然后将数据交给/opt/zhangyan.sh去后台处理,不等待/opt/zhangyan.sh处理结束,继续读取下一条数据;
  3、当允许生成的子进程数减至0时(空闲进程数$p_number=0),/opt/zhangyan.php会等待1秒钟,然后检查后台还有多少个/opt/zhangyan.sh子进程尚未处理结束;
  4、如果1秒钟之后/opt/zhangyan.php发现后台的/opt/zhangyan.sh子进程数还是500(空闲进程数$p_number=0),会继续等待1秒钟,如此反复;
  5、如果/opt/zhangyan.php发现后台尚未处理结束的/opt/zhangyan.sh子进程数减少到300个了(空闲进程数$p_number=500-300=200),那么/opt/zhangyan.php会再往后台推送200个/opt/zhangyan.sh子进程;



/opt/zhangyan.php代码如下:

  1. <?php  
  2. function run($input)  
  3. {  
  4.     global $p_number;  
  5.     if ($p_number <= 0)  
  6.     {  
  7.         $p_number = worker_processes($p_number);  
  8.     }  
  9.     $p_number = $p_number - 1;  
  10.     $out = popen("/bin/sh /opt/zhangyan.sh /"{$input}/" &", "r");  
  11.     pclose($out);  
  12. }  
  13.   
  14. function worker_processes($p_number)  
  15. {  
  16.     $limit = 500;//允许推到后台的最大进程数  
  17.     while ($p_number <= 0)  
  18.     {  
  19.         $cmd = popen("ps -ef | grep /"/opt/zhangyan.sh/" | grep -v grep | wc -l", "r");  
  20.         $line = fread($cmd, 512);  
  21.         pclose($cmd);  
  22.         $p_number = $limit - $line;  
  23.         if ($p_number <= 0)  
  24.         {  
  25.             sleep(1);//暂停1秒钟  
  26.         }  
  27.     }  
  28.     return $p_number;  
  29. }  
  30.   
  31. $input = "http://blog.s135.com"; //模拟从队列文件中读取到的数据  
  32. for ($i = 1; $i <= 1000; $i++)  
  33. {  
  34.     run($input);  
  35.     echo "Idle process number: " . $p_number . "/n";  
  36. }  
  37. ?>  

  (/opt/zhangyan.php程序用来模拟从队列文件中读取1000行数据,交给子进程/opt/zhangyan.sh去处理。)



/opt/zhangyan.sh代码如下:

  1. #!/bin/sh  
  2. echo $(date -d "today" +"%Y-%m-%d %H:%M:%S") $1 >> /opt/zhangyan.log  
  3. sleep_time=$(expr $RANDOM % 4 + 1)  
  4. sleep $sleep_time  

  (/opt/zhangyan.sh脚本用来模拟向外地接收服务器发送数据。其中的$(expr $RANDOM % 4 + 1)用来生成1~5之间的随机数,用来使程序暂停1~5秒钟。暂停1秒表示网络状况好,发送数据顺畅;暂停2~6秒表示网络状况不好,发送过程需要1~5秒。)



 执行程序:

/usr/local/php/bin/php /opt/zhangyan.php


 (/usr/local/php/bin/php因PHP解析器所在的路径)

 查看/opt/zhangyan.sh打下的日志文件的第一行和最后一行:

head -n 1 /opt/zhangyan.log

 2007-11-16 07:54:13 http://blog.s135.com

tail -n 1 /opt/zhangyan.log

 2007-11-16 07:54:18 http://blog.s135.com

  可以看出,500进程并发处理这1000条数据只耗费5秒钟。而按照原来的串行模式,处理每条数据即使只耗费最短的1秒钟,也需要1000秒,约合16分钟才能完成。



 PS:将PHP程序作为Linux守护进程的方法:

nohup /usr/local/php/bin/php /opt/zhangyan.php 2>&1 > /dev/null &


 (nohup命令可以在用户退出终端后仍然执行程序,“2>&1 > /dev/null”表示不显示标准输出和错误输出,最后的&表示推到后台执行。)

php 使用redis锁限制并发访问类 php 使用redis锁限制并发访问类 Func: public lock 获取锁 public unlock 释放锁 private connect 连接 立即下载

相关推荐

Asterisk客户端

Asterisk客户端,搭配使用实现来电拒接、弹屏等功能。

php并发处理的三种解决方案

使用队列,额外起一个进程处理队列,并发请求都放到队列中,由额外进程串行处理,并发问题就不存在了,但是要额外进程支持以及处理延迟严重,本文不先不讨论这种方法。阻塞模式下,如果进程在获取文件排他锁时,其它进程正在占用锁的话,此进程会挂起等待其它进程释放锁后,并自己获取到锁后,再往下执行。非阻塞模式下,如果进程在获取文件排他锁时,其它进程正在占用锁的话,此进程会马上判断获取锁失败,并且继续往下执行。

weixin_45090572的博客 2216

SPMI、PMBus、AVSBus:三大电源管理总线对比与选型指南

在现代电子系统中,电源管理是确保高性能与低功耗平衡的核心技术。其原理在于通过数字通信协议,实现电源管理单元(PMIC)与用电芯片间的精准“对话”,从而动态调整供电。这项技术的核心价值在于提升系统能效、增强可靠性并简化设计。其应用场景广泛,从智能手机、服务器到汽车电子无处不在。具体实现上,衍生出了三大主流协议:为移动嵌入式高度集成的SPMI总线、专注于工业标准监控的PMBus总线,以及追求极致实时能效的AVSBus总线。理解SPMI在复杂时序控制与PMBus在标准化配置方面的异同,是进行电源架构选型与调试的关

ithome 454

Asterisk 并发量到100后就出现拨打电话挂机问题

Asterisk 并发量到100后就出现拨打电话挂机问题,经过分析和研究,是由于Agi的并发量达到Asterisk-java默认的最大值100导致,无法创建新的socket连接处理Agi请求。 通过调整Agi的默认最大线程数到200,问题得到解决。但这个并不是问题最好的解决方法,个人觉得是因为Agi请求一直没有得到释放导致,所以按官网的文档,agi应该是执行简单的操作,执行时间短,尽快释放来提供

liuzhujun的专栏 5188

IDEA 2023.2最新破解安装教程(含详细配置步骤及常见问题解决)

本文详细介绍了IDEA 2023.2的安装流程及高效开发环境搭建指南,涵盖基础配置、项目结构优化、核心功能使用、插件推荐、性能优化等全方位内容,帮助开发者快速掌握这一强大的Java开发工具。

x2y3z4a5b的博客 1754

Winform使用TreeView控件实现带复选框的三态树

刚接触c#,项目中用到Treeview实现三态,即选中、未选中、半选中状态,并且要求父子节点选择联动,效果类似下图网上有很多例子,于是研究了一下,结合网上大佬们的例子,所以在这里记录一下。首先新建一个Winform工程拖个TreeView控件,然后运行。。。嗯。。。加点数据吧。private void CreateTree() { TreeNode anime = new TreeNode...

laoyezha的博客 2万+

怎样评估你需要的Asterisk系统

关于Asterisk系统的评估,在asterisk-users邮件列表里经常被问到的问题有:                为了满足我的需求,我需要CPU多快的机器?硬盘多大的机器?                  Asterisk能够处理多个并发呼叫 根据我的经验,只能提供下面的数据:                 Asterisk的1.2版本:最大250并发SI

agileclipse的专栏 1209

无人机测绘航线生成算法

JavaScript开发和测试无人机测绘航线的自动生成方法,设计可行,算法可靠

ly1302116的专栏 5236

旧台式机测试的asterisk 并发

   于2003年买的台式机现在淘汰了,为了物尽启用,现在部署了一套asterisk,并用SIPP作了压力测试。大大超出了我的预期,没有进行测试之前认为可以支持到10路-30路并发都不错啦。看看结果是否 就这么少?测试环境:操作系统:CentOS 5.5的应用服务器剪裁定制版,精简版:base安装版http://dl.wdlinux.cn:5180/wdlinux_base_32.isoasterisk 版本:asterisk-1.4.39.1dahdi 驱动版本:dahdi-linux-complete-

语音通讯-软交换asterisk,Freeswitch 3963

YOLOv11缝合添加注意力机制:添加YOLO-Face的SEAM到并行通道空间注意力机制【附代码】

在目标检测的实际应用中,物体遮挡是一个严重影响检测精度的难点。本文将基于YOLOv11架构,探索融合YOLO-Face中提出的SEAM注意力机制以提升对遮挡物体的感知能力,并在此基础上提出一种轻量化双路径并行注意力机制C2PSA,进一步提升检测性能。

一键难忘的博客 1529

⭐️【2024年新版教程】vmware tools安装步骤(Windows、Linux、MacOS版本)

VMware Tools是VMware提供的一套实用工具,它可以增强虚拟机与宿主机之间的交互性能,如改进显示性能、优化鼠标和键盘性能、提供时间同步功能等。无论是在Windows、Linux还是MacOS虚拟机上,安装VMware Tools都可以提高虚拟机的使用体验。以上就是在不同操作系统上安装VMware Tools的步骤,希望对您有所帮助。

Python老吕的博客 6万+

php并发控制,并发控制机制

# 概述并发访问控制作为数据库领域非常重要的一个问题,目前已经有比较成熟的解决方案,这里介绍三种。* 悲观并发控制* 乐观并发控制* 多版本并发控制悲观并发控制最常见,也就是我们经常说的悲观锁。乐观并发控制表示乐观锁,乐观锁不是真正的锁,而表示了一种并发控制策略。多版本并发控制(MVCC),不同于乐观锁和悲观锁的互斥关系,它能够和乐观锁悲观锁任意一种结合使用,显著提升数据库的读性能。# 悲观并发控...

weixin_42298332的博客 397

FastGPT智能体开发:FastGPT OpenAPI 知识库接口

FastGPT OpenAPI 知识库接口

王国平的博客 323

zhangyan php,PHP 并发控制样例(转)

值得参考一下该程序设计的思路:[文章作者:张宴 本文版本:v1.0 最后修改:2007.11.16 转载请注明出处:http://blog.s135.com]最近遇到一个问题,Linux下的PHP命令行程序作为守护进程,需要从队列文件中读一行数据,通过TCP协议发送给外地的接收服务器,再读下一行数据,再发送。当本地与外地的网络状况不好时,有时候发送一条数据所耗费的时间就较长,累积起来容易造成队列堵...

weixin_36035585的博客 67

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

php并发控制框架 PCF

使用PCF的主要目的有两个 : 1.使并发程序写起来更容易。写的单个脚本可以自动并发跑起来 2.使并发控制更简单。并发的进程数可以随时增多和减少,特意暂停或意外中止的程序会记录暂停点,下次执行时从暂停点继续执行。

MICweaver的技术blog 4227

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

探秘PHP并发控制库:php-lock/lock

在多线程和高并发的环境中,确保代码执行的互斥性是至关重要的。为此,我们有理由推荐一个强大的PHP库——`php-lock/lock`。它提供了一套全面的解决方案,帮助开发者在并发情况下安全地执行关键代码。 ## 项目介绍 `php-lock/lock`是一个精心设计的PHP库,用于处理并发编程中的锁机制。它遵循了语义化版本控制,并提供了多种锁实现,包括基于文件系统的`FlockMutex`、内...

gitblog_00072的博客 467

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

PHP开发者必学:roadrunner工作池原理与并发控制

作为PHP开发者,你是否还在为传统FPM模式下的性能瓶颈发愁?随着业务增长,单请求单进程的处理方式已难以应对高并发场景。roadrunner作为一款高性能PHP应用服务器,通过创新的工作池(Worker Pool)机制,将PHP应用的并发处理能力提升数倍。本文将深入解析roadrunner工作池的核心原理与并发控制策略,帮助你彻底掌握这一性能优化利器。 ## 工作池:突破PHP性能瓶颈的关键 ...

gitblog_01003的博客 1017

php redis 并发控制

针对并发控制可以使用 memcacheq ,redis channle 等方式处理 这里我单单的说一下redis 怎么去控制并发 redis控制并发主要采用 redis list api 中的lPushllenlPop 这三个函数 lLen - 获得列表的长度 lPop - 删除列表的第一个值并返回它 lPu

小码农的博客 3802

【PHP开发900个实用技巧】690.PHP实现乐观锁与悲观锁:并发控制的“双刃剑”

本文深入探讨了PHP开发中两种常见的并发控制机制:**乐观锁**和**悲观锁**,并详细分析了它们的核心原理、适用场景、实现方式以及在实际项目中的选择策略。通过丰富的案例和对比,文章为开发者提供了清晰的指导,帮助他们在高并发场景下做出最佳决策。 ### 1. **锁的基础认知:当多线程变成数据屠宰场** 文章首先指出了在并发场景下,共享资源的竞争会导致数据不一致的问题。通过一个典型的余额扣减案例,文章展示了不加锁的情况下可能出现的错误,并引出了悲观锁和乐观锁的概念,帮助开发者理解锁的本质目的。 ##

868

【PHP协程并发控制终极指南】:掌握高并发场景下的性能调优秘籍

掌握PHP协程并发控制的核心方法,深入解析PHP协程的并发限制配置在高并发场景下的应用。涵盖Swoole等扩展的配置技巧、协程池与限流策略,提升系统稳定性与性能。实用调优方案值得收藏。

InstrFun的博客 593

从家庭自动化到工业IoT,PHP如何实现千台设备并发控制?

掌握PHP物联网设备控制的高效方案,实现家庭自动化与工业IoT场景下千台设备并发管理。通过轻量级消息队列与异步通信机制,提升响应速度与系统稳定性,适用于智能家电、工厂传感器等多场景。方法实用,架构可扩展,值得收藏。

InstrGap的博客 678

锁php_mysql 的读写锁与并发控制

1.无论何时只要有多个查询在同一时刻修改数据,都会产生并发控制的问题2.讨论mysql在两个层面,服务器层和存储引擎层,如何并发控制读写3.举了个mbox邮箱文件的例子,说如果有多个进程同时对mbox文件写东西,那么在文件的末尾会,交叉混乱的添加,比如进程1写了几行,进程2也写了几行,互相交叉,数据就是错误的了.设计良好的mbox需要加锁,比如进程1锁住了文件,进程2必须等待进程1结束,锁释放才能...

weixin_36083698的博客 139

php代码并发控制,php并发控制

这两天遇到一个常见的并发控制的问题,类似抢票问题,当剩下一张票的时候 两个人同时抢这张票 可能会出现多卖的情况在发短信的时候 一般会限制一个手机号发送一次的时间间隔在60s我们的代码大概会这么写12345678910$time = getLastSendTime();if (time() - $time > 60) {sendSms();# 更新最后发送时间updateLastSendTim...

weixin_33146151的博客 412

php 并发控制,php并发控制中的独占锁

1.并发问题并发大家都知道是什么情况,这里说的是并发多个请求抢占同一个资源,直接上实例吧请求:index.php?mod=a&action=b&taskid=6处理:$key = "a_b::".$uid.'_'.$taskid;$v = $redis->get($key);if($v == 1){$redis->setex($key,10,1);//处理逻辑省略}2....

weixin_34583171的博客 162

揭秘PHP库存扣减痛点:如何用Redis+Lua实现毫秒级并发控制

解决高并发库存超卖难题,深入解析PHP在电商系统中的库存并发控制(Redis+Lua)实现方案。适用于秒杀、抢购等场景,通过Lua脚本原子操作Redis,确保数据一致性与毫秒级响应。高效、可靠,值得收藏。

PixelGlow的博客 1079
上一篇: MyISAM 表的锁定机制
下一篇: 你的电话营销业务是否还在用原始的手工模式
Carryf
博客等级 码龄24年 106粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值