【问题标题】:Is it a good idea to store a large website menu in a PHP session? [closed]在 PHP 会话中存储大型网站菜单是个好主意吗? [关闭]
【发布时间】:2018-09-06 17:12:08
【问题描述】:

我有一个电子商务网站,它有一个相当大而复杂的菜单系统,其中包含许多类别和子类别。有一百多个条目。

将整个内容存储在字符串或数组中作为 PHP 会话变量是否是个好主意,这样导航菜单就不会一次又一次地从每个页面上的数据库中查询?

或者对于会话变量来说太大了?

【问题讨论】:

  • 菜单都是独一无二的?
  • @Farkas 它是否因用户而异?即用户 #1 的菜单是否与用户 #2 完全不同?
  • @ceejayoz 不,每个人都一样。
  • @Farkas 在这种情况下,将其存储在会话中会非常浪费。你可以缓存它,但无论你做什么都应该是共享存储。会话数据是针对每个用户的,因此您将保存数千份相同大数据的副本。
  • 为每个 http 请求查询数据库不会是页面加载最慢的事情。很多很多非常快的网页在一次渲染中执行几十个 sql 查询。

标签: php performance session


【解决方案1】:

将整个内容存储在字符串或数组中作为 PHP 会话变量是否是个好主意,这样导航菜单就不会一次又一次地从每个页面上的数据库中查询?

没有。不要在会话中存储非特定于该会话的数据。

缓存这些数据有很多更好的选择;其中一些是:

【讨论】:

    【解决方案2】:

    我建议为此使用任何缓存系统。

    例如,您可以使用 APC(高级 PHP 缓存):

    安装它(基于 Debian 的 unix 示例):

    sudo apt-get install php-apc
    

    并实际使用它:

    function getMenuDataFromDatabaseWithCache()
    {
    
    // first - let's try to get results from cache
    $cachedResults = apc_fetch('db_results');
    
    // if there is a result - let's return it
    if($cachedResults !== false) {
        return $cachedResults;
    }
    
    // if there is no results let's fetch all you need from the database
    $fetchedResults = $mysql->someFunctionToGetData();
    
    // store results in the cache for 1 day (1 day = 86400 seconds)
    apc_add('db_results', $fetchedResults, 86400); 
    
    // so hest time the function will return cached results, without fetching from DB
    return $fetchedResults;
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多