我有一个应用程序,它根据predefined URLs
以下方式路由请求:
第一步:缓存查找
所有的URLS
都聚合成一个array
(序列化并存储在缓存中),其结构如下:
- 每个
array key
代表一个URL
URL
信息(即如何处理URL
)被定义为对应的array value
。
在实践中,这给了我(仅供参考的PHP 5.4
数组语法):
<?php
// structure of the cached URLS array
$cached_urls = [
'/pageA' => [
'controller' => 'ProductController',
'content_id' => 1234
],
'/serviceA' => [
'controller' => 'ServiceController',
'content_id' => 45678
]
];
// working with the array (retrieve $cached_urls from cache, then...)
if (!isset($cached_urls[$request['url']])) {
// 404
} else {
$url = $cached_urls[$request['url']];
// further actions based on $url
}
第二步:
如果$cached_urls
无法从缓存中检索到数组,则进行数据库查找和缓存重建我会做 3 件事:
- 从表中检索
URL
信息url
(其中每个row
代表1 URL
和URL
本身是用于过滤查询的字段)和其他相关表。 - 处理请求的方式与在缓存场景中处理请求的方式相同
$url
- 重建缓存,以便下次请求进入时,我不必进行数据库查找,
在执行速度方面,这是我们所拥有的(从快到慢):
- 缓存查找(~10ms)
- 数据库查找(~100ms)
- 重建缓存(~2000ms)
当缓存可用时,页面的服务速度非常快,但是每次重建缓存时(大约每分钟),页面需要几秒钟才能提供服务,这是一个问题。因此我想知道:
PHP中有哪些设计模式可用于执行异步处理(在我的情况下将用于重建缓存)同时避免同时执行多次相同的任务(因为我只需要一次重建缓存一次直到它被重建,而不是同时击中我的应用程序的每个请求)?