同时运行两个PHP吗,PHP-避免由两个工作人员同时运行后台作业

我有一个守护程序,运行我们的Web服务请求的后台作业.我们有4个工人同时运行.

有时,一个作业同时执行两次,因为两个工人决定运行该作业.为了避免这种情况,我们尝试了几件事:

>因为我们的工作来自数据库,所以我们添加了一个称为execute的标志,该标志防止其他工作获得已经开始执行的工作;这不能解决问题,有时我们数据库的延迟足以同时执行.

>在系统中添加了memcached(所有工作程序都在同一个系统中运行),但是由于某种原因,我们今天同时运行了多个作业-memcached不能同时解决多台服务器的问题.

这是我们当前正在使用的以下逻辑:

// We create our memcached server

$memcached = new Memcached();

$memcached->addServer("127.0.0.1", 11211);

// Checkup every 5 seconds for operations

while (true) {

// Gather all operations TODO

// In this query, we do not accept operations that are set

// as executed already.

$result = findDaemonOperationsPendingQuery();

// We have some results!

if (mysqli_num_rows($result) > 0) {

$op = mysqli_fetch_assoc($result);

echo "Found an operation todo #" . $op['id'] . "\n";

// Set operation as executed

setDaemonOperationAsDone($op['id'], 'executed');

// Verifies if operation is happening on memcached

if (get_memcached_operation($memcached, $op['id'])) {

echo "\tOperation id already executing...\n";

continue;

} else {

// Set operation on memcached

set_memcached_operation($memcached, $op['id']);

}

... do our stuff

}

}

通常如何解决这种问题?

我上网查找了一个名为Gearman的库,但是我不相信当我们有多台服务器时,它可以解决我的问题.

我想到的另一件事是预定义一个守护程序以在插入时运行该操作,并创建一个故障安全的独占守护程序,该守护程序运行由停止运行的守护程序设置的操作.

有任何想法吗?

谢谢.

解决方法:

假设每个工作人员都有一个ID,这是使用锁和事务的一种替代解决方案.

在循环中运行:

UPDATE operations SET worker_id = :wid WHERE worker_id IS NULL LIMIT 1;

SELECT * FROM operations where executed = 0 and worker_id = :wid;

该更新是单个操作,它是原子操作,您仅在尚未设置worker_id的情况下进行设置,因此不必担心竞争状况.设置worker_id可以清楚地知道谁拥有该操作.由于LIMIT 1,此更新将只分配一项操作.

标签:concurrency,daemon,mysql,php

来源: https://codeday.me/bug/20191025/1928540.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550803.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php类的举例,用类来代替递归方法,用php举例_php _ 搞代码

问题:一个楼梯有n个台阶,每次上一个或两个台阶,共有多少种上法, 每种走法的步骤是什么样的?这个简单问题,我们通常的方法是写一个递归调用,简单明了。但是,这里通过类的叠加来实现,虽…

mysql创建多实例,mysql 单服务器创建多实例

mysql单服务器启动多个实例实际有两种方式第一种方式就是使用mysql mysqld_multi第二种方式就是分别使用不同的目录端口启动不同的实例第一种方式:1、数据库实例目录data3306data3307data33082、创建实例/usr/local/mysql//scripts/mysql_install_db –basedir/usr…

matlab st变换,ST转换(matlab代码)

【实例简介】【实例截图】【核心代码】samplingrate 0.00005;[s,t,f]st(amplitude,0,0.5/samplingrate,samplingrate,1);Tmax(t);subplot(3,1,1),plot(t,amplitude,color,k,linewidth,1)xlabel(时间/s);ylabel(幅值/V);xlim([0 T]);% title(微震波形,FontName,Times New Roman…

easyexcel安全扫描报php,easyExcel使用以及踩过的坑

easyExcel介绍:Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是…

python selenium下载,在python中通过Selenium Webdriver下载文件

在使用新的FirefoxProfile时,使用set_preference方法来配置配置文件,这样就可以单击Save和{},并且在下载过程中不会被中断。您可以按如下方式设置配置:profile webdriver.FirefoxProfile()profile.set_preference("browser.…

用python做人脸识别的程序怎么做,10分钟学会使用python实现人脸识别(附源码)

前言今天,我们用Python实现简单的人脸识别技术!Python里,简单的人脸识别有很多种方法可以实现,依赖于python胶水语言的特性,我们通过调用包可以快速准确的达成这一目的。这里介绍的是准确性比较高的一种。一、首先梳理…

matlab是那个国家,这是一个老外写的利用曲率来识别硬币的MATLAB程序。作者所在国家的硬币偏黄色,拍摄的时候反光比较少...

这是一个老外写的利用曲率来识别硬币的MATLAB程序。作者所在国家的硬币偏黄色,拍摄的时候反光比较少2016-08-22 0 0 0 暂无评分其他1积分下载如何获取积分?这是一个老外写的利用曲率来识别硬币的MATLAB程序。作者所在国家的硬币偏黄色,拍摄的…

oracle中12523,【Oracle】静态监听导致的ORA-12523错误

今天配置完共享服务器模式之后发现登录过程中报错ORA-12523,排查错误之后发现是静态监听惹的祸。本机之上有两个监听,一个静态监今天配置完共享服务器模式之后发现登录过程中报错ORA-12523,排查错误之后发现是静态监听惹的祸。本机之上有两个…

线性回归中oracle性质,66.Oracle数据库SQL开发之 高级查询——使用线性回归函数...

66.Oracle数据库SQL开发之 高级查询——使用线性回归函数线性回归函数可以用普通最小平方回归曲线拟合一组数值对。线性回归函数可用于聚合、串口或报表函数。如下图1:例如:storePDB1> selectprd_type_id,regr_avgx(amount,month) as avgx,regr_avgy(…

angularjs php 实例下载,AngularJS Eclipse 1.2.0 插件下载

【实例简介】AngularJS Eclipse 插件为Eclipse提供对AngularJS的支持【实例截图】【核心代码】org.eclipse.angularjs.category-1.2.0├── artifacts.jar├── content.jar├── features│ ├── angularjs-eclipse-feature.source_1.2.0.201606160950.jar│ ├── …

oracle asm磁盘回收步骤,【翻译自mos文章】回收 asm磁盘空间的方法

回收 asm磁盘空间的方法参考原文:How To Reclaim Asm Disk Space? (Doc ID 351866.1)适用于:Oracle Database - Enterprise Edition - Version 10.2.0.1 and laterInformation in this document applies to any platform.***Checked for relevance on 1…

Oracle 4dae,如何处理Python-CXOracle中未知词的错误报告问题,pythoncxOracle,查询,到,生僻字,报错...

关于编码GBK编码是GB2312编码的超集,向下完全兼容GB2312,同时GBK收录了Unicode基本多文种平面中的所有CJK汉字。GB18030编码向下兼容GBK和GB2312,兼容的含义是不仅字符兼容,而且相同字符的编码也相同。GB18030收录了所有Unicode3.…

impala写入oracle,dataframe 写入 impala 语法错误,怎么解决?

dataframe写入impala出现语法错误,错误:Exception in thread "main" java.sql.SQLException: [Simba]ImpalaJDBCDriver ERROR processing query/statement. Error Code: 0, SQL state: TStatus(statusCode:ERROR_STATUS, sqlState:HY000, erro…

php windows 64下载地址,VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器教程:其它版本推荐:vscode简介:vscode是一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代 Web 和云应用的跨平台源代码编辑器。该编辑器也集成了所有一款现代编辑器所应该具备…

linux 源码目录结构,分析Android 源代码编译前后的目录结构

我们看没有编译前的项目目录大致的情况如下 :在树结构中我们可以了解的有如下一些信息分析:1. getSplashy 项目名称;2. src 项目程式;3. com 早…

linux vps 运行exe文件夹,在centos环境下运行.exe文件

首先要了解一下Wine:Wine (“Wine Is Not an Emulator” 的首字母缩写)是一个能够在多种 POSIX-compliant 操作系统(诸如 Linux,Mac OSX 及 BSD 等)上运行 Windows 应用的兼容层。Wine (Wine Is Not an Emulator)[即Wine不是一个模拟器]是一个在Linux和U…

linux运行时命令找不到,linux - 在运行Bash脚本时找不到命令,但是在直接运行命令时有效 - 堆栈内存溢出...

我一直在使用letencrypt为我的网站生成SSL证书,更具体地说是letencrypt_webfaction。 当我在项目中运行此命令时,它可以工作letsencrypt_webfaction --letsencrypt_account_email --domains --public --username --password 但是,当我在bash脚…

linux iconv命令详解,iconv命令

iconv命令:Convert encoding of given files from one encoding to another,更改文件的编码格式语法格式:iconv -f encoding -t encoding inputfile常用选项:-f encoding :把字符从encoding编码开始转换-t encoding :把字符转换到…

linux服务器u盘启动项检测不到,将U盘设置为第一启动项之后却检测不到U盘怎么办?...

对于如何使用U盘装系统,想必看过小编之前介绍的朋友应该大致都清楚了吧?虽然说咱们使用U盘装系统的操作步骤还是比较简单的,但是却必须要满足一个条件,那便是将咱们的U盘设置为第一启动项,那么如何进行设置呢?这便需要在咱们win…

linux内核io源码,Linux Kernel do_io_submit()函数整数溢出漏洞

发布日期:2010-09-21更新日期:2010-09-27受影响系统:Linux kernel 2.6.x不受影响系统:Linux kernel 2.6.36-rc4描述:--------------------------------------------------------------------------------BUGTRAQ ID: …