数据库修改的典型 Gearman 流程是什么?

What is a typical Gearman flow for database modification?

希望在理解使用 Gearman 结合 PHP(以及其他内容)执行一系列任务时的典型最佳实践方面有所帮助。

基本场景如下:

用户通过基于网络的界面上传一组图像文件。响应 POST 请求的 php 代码在数据库中为每个文件生成一个条目,大多数列中的条目为空,为每个文件排队一个作业以使用 Gearman 进行分析,生成一个状态页面和退出。

Gearman 工作人员获得了一个文件的工作,并开始了相对较长的 运行 分析。该分析的结果是一组参数,需要将其插入回该文件的数据库记录中。

我的问题是,普遍接受的方法是什么?我应该使用一个最终会启动另一个 php 脚本来进行修改的回调,还是应该由工作函数本身来进行数据库修改?

目前一切都运行在同一台机器上;我计划使用 Gearman 进行后台调度,而不是通过分摊到不同的机器来进行扩展,但无论如何,任何功能都可以连接到数据库,无论它在哪里。

任何想法表示赞赏;只是寻找一些关于这通常是如何构建的以及什么可能被认为是最佳实践的见解。

您确定要使用 Gearman 吗?我之所以问,是因为它是大约 15 年前事实上的 PHP 作业服务器,但在很长一段时间内都不是可靠的解决方案。我不确定在过去的 12 个月里情况是否有显着改善,但上次我评估 Gearman 时,它不具备生产能力。

现在,开始提问。

what is the generally accepted method of doing this? Should I use a callback that will ultimately kick off a different php script that is going to do the modification, or should the worker function itself do the database modification?

您将在任何作业队列中遵循此通用模式:

  • 收集一个工作单元。在您的情况下,它将是其中一张图片以及有关该图片属于谁、用户 ID 等的任何信息。
  • 使用此信息将工作提交到作业队列。
  • Job Queue 的工作进程拾取工作并开始处理它。这是我在数据库中创建记录的地方,因为您可以选择在作业失败时不创建它们。

作业队列将跟踪哪些作业已完成,通常是完成状态。如果您使用的是 gearman,这就是 gearmand 进程。您还需要一些有效的拾取工作和流程,我将其称为工作人员。 job worker 是并发发生的地方,我认为你在说 "kick off a different php script." 时指的是你可以在一段时间内(使用 supervisord 或 cronjob)启动一个 PHP 脚本以获得某种轮询和分叉方法。这不是最有效的方法,但听起来对您的应用程序用例来说并不重要。您还可以使用 pcntl_fork 或 PHP 中的 pthreads 来更好地控制您的并发进程并实施工作池模式,但它比仅仅触发脚本要复杂得多。如果您有兴趣尝试在 PHP 中实现一些并发性,我在 GitHub 上有一个用于 beantalkd 的概念验证作业工作者,它实现了一个同时具有 fork 和 pthreads 的工作池。我还包含了一些关于并发主题的其他资源。