【问题标题】:Cache or preload some variables in php在php中缓存或预加载一些变量
【发布时间】:2016-08-04 18:51:57
【问题描述】:

我正在开发一个基于 PHP/MySQL 的产品搜索应用程序。在该应用程序中,我们有一些从数据库中填充的全局变量。由于这些变量对于所有搜索请求都是通用的,因此无需在每次搜索请求到达服务器时都进行填充。

我看到了一些使用 memcache 和 APC 的建议,但问题是我们无权在服务器中安装它们。有什么方便的方法让这些变量只初始化一次并用于所有服务器请求?

一些变量的例子:

$result = $this->db->query("SELECT brand_name FROM brands");
    if ($result->num_rows > 0) {
        foreach ($result->rows as $row) {
            if ($row['brand_name'] != '') {
                $GLOBALS["filter"]['brand_name'][] = $row['brand_name'];
            }
        }
    }

它包含在搜索查询中用于比较的品牌名称。同样,我们还有许多其他预定义的全局变量。

【问题讨论】:

  • 这行得通吗?一般来说,全局变量可能会很麻烦,但如果这有助于解决您的问题,那可能不是一个糟糕的主意。记录操纵全局变量的函数总是一个好主意,这样它们的影响就众所周知了。没有什么比其他一些想要控制$GLOBALS['filter'] 的代码更糟糕的了,这两者就会发生冲突。
  • @tadman 我有 $GLOBALS["filter"]['brand_name']、$GLOBALS["filter"]['categories'] 等格式的全局变量。我可以将变量从全局更改为任何其他变量,但我需要一个解决方案,以便它不会针对每个服务器请求进行初始化。
  • brands 表中的数据多久更改一次?
  • @MonkeyZeus 很少,几个月一次。我们可以认为这些值是静态的。
  • 网站在哪个 PHP 版本上运行?

标签: php mysql


【解决方案1】:

如果您有 opcache 可用,那么您也许可以执行以下操作:

免责声明:我没有对此进行测试,也没有使用 opcache 功能或行为的经验。


计划任务(每月?手动?自动?idk,你想办法)

$result = $this->db->query("SELECT brand_name FROM brands");

if ($result->num_rows > 0) {

    $temp_file = '/path/to/cached/file/brands_cache.'.microtime(true).'.php';

    $final_file = '/path/to/cached/file/brands_cache.php';

    file_put_contents($temp_file, '<?php $GLOBALS["filter"]["brand_name"] = [];');

    foreach ($result->rows as $row) {
        if ($row['brand_name'] != '') {
            file_put_contents($temp_file, '$GLOBALS["filter"]["brand_name"][] = \''.str_replace("'", "\\'", $row['brand_name']).'\';', FILE_APPEND);
        }
    }

    rename($temp_file, $final_file);

    if(opcache_compile_file($final_file))
    {
        echo $final_file.' has been cached';
    }
    else
    {
        echo $final_file.' could not be cached';
    }
}

您的搜索引擎

require_once('/path/to/cached/file/brands_cache.php');

// Feel free to use $GLOBALS["filter"]['brand_name']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 2015-07-07
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多