gpt4 book ai didi

php - PHP/MySQL 中的异步消息传递?

转载 作者:行者123 更新时间:2023-11-29 02:05:02 25 4
gpt4 key购买 nike

我在图像托管网站(Gallery 的竞争对手)上工作,需要加强我的游戏。新照片通过 FTP 上传或放置在服务器上并被索引(快速),然后它们被缩略图(慢)。

  1. 最简单的实现是允许用户在等待时上传、索引和缩略图(网页加载缓慢)。管理员可以登录到索引,然后缩略图其他手动上传的文件(页面加载缓慢,刷新可能需要数小时)。

  2. 我现在的实现是用户上传导致在他们等待时建立索引,有时(随机)整个站点索引在正常页面加载之上搭载(给用户带来额外的边际延迟)。站点上的页面指的是缩略图所在的 URL(如果存在)。如果用户请求一个不存在的缩略图,它会在他们等待时创建(“惰性缩略图”)。

2 的好处是在多核系统上,所有核都被使用。缺点是第一次需要加载 30x50 MB 的新照片页面并且页面超时,一些图像完成而其他图像正在加载子序列。

问题是在这里执行任务处理的正确方法是什么?如果它扩展到共享数据库上的多个服务器,则加分。

下面是一个想法(可能是胡言乱语):

我考虑过在数据库中创建一个作业表:

id INT NOT NULL AUTO_INCREMENT, 
priority INT NOT NULL,
worker INT,
workstarted DATETIME,
func CHAR(10) NOT NULL,
args VARCHAR NOT NULL,
PRIMARY KEY(id),
INDEX(priority),
UNIQUE(func,args) -- prevent duplicate jobs if user does F5

然后当需要完成工作时,插入一行并创建一个工作线程(如果尚不存在足够的线程)。然后等待响应并继续,如果作业成功完成,或者 5 秒后超时。如果出现超时,则在内容可用时使用 AJAX 将内容提供给用户。

在这种方法中我不知道如何做的事情是:如果存在足够的工作线程如何协调(使用表和心跳?),工作线程如何发送响应(完成后删除作业并写入如果失败到另一个表?),请求者如何有效地等待响应或超时(比轮询数据库更好的方法?)。根据处理这些问题的方法,系统可以随着在不同服务器上运行的工作人员进行扩展。

最佳答案

我建议使用 ZeroMQ解决你的问题。

它是一个具有多种语言(包括 PHP)绑定(bind)的套接字框架。您可以在不使用数据库的情况下开发一个工作人员系统,并且可以跨多个节点(执行工作的物理机器)扩展工作。

Here's an introduction to the 0MQ .

Here's the documentation with PHP examples .

Here's the 0MQ guide at github .

主观意见:使用 0MQ 简直太棒了。它的速度快得令人难以置信,并且有大量的示例,并结合了出色的指南。

关于php - PHP/MySQL 中的异步消息传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8038498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com