【问题标题】:Advice on creating PHP-MySQL background tasks关于创建 PHP-MySQL 后台任务的建议
【发布时间】:2023-03-17 12:32:02
【问题描述】:

我正在寻找有关我正在构建的东西的建议:我有一个 PHP 应用程序,它可以创建、更新和删除记录,但它紧密集成在一个基于非 sql 的旧数据库中,而且速度真的很慢当您开始进行大量数据库调用时。 我想为用户提供更多的后台体验,这样当用户创建或编辑某些内容时,所有变量、数组和对象都需要写入 MySQL 数据库,然后后台脚本将启动以读取这些记录并处理对遗留数据库的请求。

所以我需要一个跟踪任务的表,然后需要另一个跟踪所有变量、对象、数组及其值的表。

这就是我认为第二个表的数据库结构必须是:

  • 用于存储 task_id 的列
  • 如果 var 是数组或对象,则存储一列,如果是简单 var,则为 NULL。
  • 用于存储数组/对象变量名称的列。
  • 如果它是一个对象的列,则存储它是对象的类型。
  • 用于存储数组/对象组 ID 的列。 (用于跟踪哪些变量属于对象/数组)
  • 在对象/数组中存储简单变量、方法或名称的列
  • 用于存储 var 值的列

这里有几个例子:

1 | NULL     | NULL        | NULL          | NULL | 'foo'        | 'bar'
1 | 'array'  | 'foo_array' | NULL          | 1    | 'foo'        | 'bar'
1 | 'array'  | 'foo_array' | NULL          | 1    | 'foo2'       | 'bar2'
1 | 'object' | 'foo_obj'   | foobar_object | 2    | 'foo_method' | 'bar'
1 | 'object' | 'foo_obj'   | foobar_object | 2    | 'bar_method' | 'foo'

这似乎是一种过于复杂的方法吗?我疯了吗?有人能想出更好的方法吗?

谢谢。

【问题讨论】:

  • 听起来这种方法可能会使体验变得更糟,因为在处理队列之前不会将用户交互写入您的数据库。有什么不能迁移的原因?

标签: php mysql database-design


【解决方案1】:

使用serialize()

它将生成一个特殊格式的字符串(您可以存储在您的数据库中)。该字符串的特殊之处在于 unserialize() 可以将其转换回其原始 php 值。它维护变量类型、值和结构。自定义对象和多维数组都没有问题。

你仍然需要你的数据库表的一部分,这只是为你做了很多工作,而且做得很好。

【讨论】:

  • 你简直让我大吃一惊,克里斯!谢谢,显然这比我预期的要容易得多!
【解决方案2】:

我会创建一个表,它有一个主键(也许是 task_id),然后是一个列来存储变量的序列化散列(或者可能是 json 编码)。您甚至可以将其存储在跟踪任务的原始表中。我假设该表将有一个状态列,其值为:

等待, 加工, 完成,并且 错误

当我们在内部执行此操作时,我们只使用一个 tinyint(1) 无符号列。您还可以添加一个或三个时间戳字段来表示任务的创建、开始和完成时间。一旦你开始滚动,这一切都非常简单。

【讨论】:

  • 是的,确切地说,状态 ID 和其他一些用于识别行的东西。是的,你是对的,我可能只需要一张表来存储所有这些数据。为什么要存储变量的序列化哈希?为什么不按原样存储呢?只是为了安全?
  • 我通常将其存储为哈希,以便更容易解析,并且可以存储无限量的数据。有些任务可能需要 2 个变量,有些可能需要 50 个。通过使用哈希,我可以将所有信息存储在一个列中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多