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



希望得到一些帮助,以理解将Gearman与PHP结合使用(以及其他事项(执行一系列任务的典型最佳实践。

以下是基本方案:

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

Gearman 工作线程获取文件作业并开始相对长时间运行的分析。该分析的结果是一组参数,需要将其插入回该文件的数据库记录中。

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

所有内容当前都在同一台计算机上运行;我计划使用 Gearman 进行后台调度,而不是通过耕种到不同的机器进行扩展,但无论如何,任何功能都可以连接到数据库,无论它在哪里。

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

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

现在,进入问题。

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

对于任何作业队列,您将遵循以下常规模式:

  • 收集工作单元。 在您的情况下,它将是其中 1 个图像以及有关该图像所属者、用户 ID 等的任何信息。
  • 使用此信息将工作提交到作业队列。
  • 作业队列的工作进程选取工作并开始处理它。 这是我在数据库中创建记录的地方,因为您可以选择在作业失败时不创建它们。
作业队列将跟踪已完成的作业,通常跟踪完成状态。 如果您使用的是齿轮工,这就是齿轮加工过程。 你还需要一些拾取工作和处理工作,我将其称为工作工作者。 工作工作者是并发发生的地方,我认为这就是您在说"启动不同的 php 脚本"时所指的。 你可以每隔一段时间(使用主管或cronjob(启动PHP脚本,以获得一种轮询和分叉方法。 这不是最有效的方法,但听起来对您的应用程序用例并不真正重要。 您还可以在 PHP 中使用 pcntl_fork 或 pthreads 来更好地控制并发进程并实现工作线程池模式,但这比仅仅触发脚本要复杂得多。 如果您有兴趣尝试在 PHP 中实现一些并发性,我在 GitHub 上提供了一个用于 beanstalkd 的概念验证工作线程,它实现了具有 fork 和 pthreads 的 worker 池。 我还提供了一些关于并发主题的其他资源。

  • 作业辅助角色(线程(
  • 作业工作者(叉子(
  • PHP 守护程序示例
  • PHP IPC 示例

相关内容

  • 没有找到相关文章

最新更新