Wordpress - 具有状态范围的全局变量与 WP 选项缓存问题
Wordpress - Global Variable with Stateful Scope vs WP Options Caching Issue
问题来了。
每次在 woocommerce 中下订单时,我都需要增加一个域特定的订单号。
我尝试使用 wp_option 功能,这样无论何时何地运行它都会存在。我使用了以下辅助函数。
$this->$order_number = get_option('next_order_number'); // To retrieve next number
update_option('next_order_number',$this->$order_number +1); // To update number
return $this->$order_number;
我遇到的问题是,当两个订单背靠背进来时,时间足够接近,get_option 是 return 相同的订单号。
所以,缓存更新太慢或太愚蠢,无法弄清楚我在两个执行上下文中访问同一个变量。
在 .NET 世界中,我们可以做很多不同的事情来解决这个问题。但是,我是 wordpress 的新手,我不太清楚如何处理这种异常情况。
我的想法是创建一个单例 Class,并在内部增加数字和 return 整数,然后触发对 wp_option 的更新。
假设单例适用于所有 wordpress 请求,如果由于服务器重启等原因重置当前值,我可以加一点额外的胶水来获取当前值...
但是,即使在创建用于单例模式的静态变量时,该值也不会跨请求保持不变。
我开始认为 PHP/Wordpress 不支持类似于 Microsoft MVC 的任何类型的应用程序状态。
有没有我可以利用的任何挂钩或技术,我可以在其中启动一个全局变量,该变量保持状态并跨所有用户的所有请求生存,并在进程回收时重新初始化。
你是对的 - PHP 在请求之间不保持任何应用程序状态,因为通常它是 运行 使用像 Apache 这样的网络服务器,通常配置为 运行每个请求一个 PHP 的实例。
相反,您需要将其保存到数据库中并查询数据库以获取号码。很像你现在正在做的,但绕过了缓存选项。现在,话虽这么说,您不想每次都只读取数字并使用它——因为两个用户可能会尝试使用不同的 PHP 进程同时读取数字。相反,最好的做法是将订单号作为自动增量插入到数据库中。这将在数据库中保留此订单号。然后,如果另一个用户同时出现并尝试使用该插入件获取订单号,它将失败,因此您可以使用更高的数字重试。
综上所述,这通常是默认情况下使用跟踪订单的任何系统完成的。 woocommerce 不是已经有了他们订单的主键吗?为什么不用那个?如果您需要一个特定于某个域的数字,为什么不只计算到目前为止该域的订单数量,并在创建并具有默认的 woocommerce 订单号后将其保存到订单中?
问题来了。
每次在 woocommerce 中下订单时,我都需要增加一个域特定的订单号。
我尝试使用 wp_option 功能,这样无论何时何地运行它都会存在。我使用了以下辅助函数。
$this->$order_number = get_option('next_order_number'); // To retrieve next number
update_option('next_order_number',$this->$order_number +1); // To update number
return $this->$order_number;
我遇到的问题是,当两个订单背靠背进来时,时间足够接近,get_option 是 return 相同的订单号。
所以,缓存更新太慢或太愚蠢,无法弄清楚我在两个执行上下文中访问同一个变量。
在 .NET 世界中,我们可以做很多不同的事情来解决这个问题。但是,我是 wordpress 的新手,我不太清楚如何处理这种异常情况。
我的想法是创建一个单例 Class,并在内部增加数字和 return 整数,然后触发对 wp_option 的更新。
假设单例适用于所有 wordpress 请求,如果由于服务器重启等原因重置当前值,我可以加一点额外的胶水来获取当前值...
但是,即使在创建用于单例模式的静态变量时,该值也不会跨请求保持不变。
我开始认为 PHP/Wordpress 不支持类似于 Microsoft MVC 的任何类型的应用程序状态。
有没有我可以利用的任何挂钩或技术,我可以在其中启动一个全局变量,该变量保持状态并跨所有用户的所有请求生存,并在进程回收时重新初始化。
你是对的 - PHP 在请求之间不保持任何应用程序状态,因为通常它是 运行 使用像 Apache 这样的网络服务器,通常配置为 运行每个请求一个 PHP 的实例。
相反,您需要将其保存到数据库中并查询数据库以获取号码。很像你现在正在做的,但绕过了缓存选项。现在,话虽这么说,您不想每次都只读取数字并使用它——因为两个用户可能会尝试使用不同的 PHP 进程同时读取数字。相反,最好的做法是将订单号作为自动增量插入到数据库中。这将在数据库中保留此订单号。然后,如果另一个用户同时出现并尝试使用该插入件获取订单号,它将失败,因此您可以使用更高的数字重试。
综上所述,这通常是默认情况下使用跟踪订单的任何系统完成的。 woocommerce 不是已经有了他们订单的主键吗?为什么不用那个?如果您需要一个特定于某个域的数字,为什么不只计算到目前为止该域的订单数量,并在创建并具有默认的 woocommerce 订单号后将其保存到订单中?