php mysqli 一次查询的数据集供全部其他页面共享,不需要再重复查询的方法

在 PHP 中,如果你希望在一次查询后将数据集共享给所有其他页面,而不必在每个页面上重复查询数据库,你可以考虑以下几种方法:

1、使用会话(Session)存储数据:
这种方法适用于数据集不是特别大,且可以在用户会话期间保持有效的情况。你可以将查询结果序列化为字符串,然后存储在会话变量中。

// 在一个页面上查询数据
session_start();
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_database";

$conn = new mysqli($servername, $username, $password, $dbname);
$result = $conn->query("SELECT * FROM your_table");

$data = [];
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        $data[] = $row;
    }
}

$_SESSION['shared_data'] = serialize($data);
// 在其他页面上访问数据
session_start();
if (isset($_SESSION['shared_data'])) {
    $data = unserialize($_SESSION['shared_data']);
    // 现在你可以使用 $data 变量了
}

注意:使用会话存储大型数据集可能会影响性能,因为会话数据通常存储在服务器上,并且在每个请求时都会加载。此外,序列化数据也会增加处理时间。

2、使用缓存:
对于更大的数据集或需要更长时间保持有效的数据,你可以考虑使用缓存解决方案,如 Memcached 或 Redis。这些缓存系统允许你存储数据在内存中,从而快速访问。

// 使用 Memcached 示例
$memcached = new Memcached();
$memcached->addServer('localhost', 11211);

// 查询数据并存储到缓存
$key = 'shared_data_key';
$data = $memcached->get($key);
if ($data === false) {
    $conn = new mysqli($servername, $username, $password, $dbname);
    $result = $conn->query("SELECT * FROM your_table");

    $data = [];
    if ($result->num_rows > 0) {
        while($row = $result->fetch_assoc()) {
            $data[] = $row;
        }
    }

    $memcached->set($key, $data, 3600); // 设置缓存有效期为1小时(3600秒)
}
// 在其他页面上,你可以通过相同的键从缓存中获取数据
$memcached = new Memcached();
$memcached->addServer('localhost', 11211);
$data = $memcached->get('shared_data_key');

3、使用数据库视图或存储过程:
虽然这不是在 PHP 层面共享数据,但你可以通过创建数据库视图或存储过程来封装复杂的查询逻辑,然后在需要时从视图中查询数据或调用存储过程。这种方法可以减少重复代码,但并不能减少数据库查询次数(除非视图或存储过程被数据库系统缓存)。

4、持久化存储:
对于需要在多个用户或长时间内共享的数据,你可以考虑将其存储在持久化存储中,如数据库表、文件或对象存储服务。然后,你可以编写 API 或其他方法来访问这些数据。
选择哪种方法取决于你的具体需求,包括数据集的大小、访问频率、用户数量以及你对性能和可扩展性的要求。