关于PHP有点迷茫。。。

@Ta 2023-05-15发布,2023-05-15修改 362点击

我看很多php程序连接数据库部分都一个
db.php 里面内容

try {
    $pdo = new PDO('mysql:host=localhost;dbname=mydb', 'username', 'password');
} catch (PDOException $e) {
    echo $e->getMessage();
}

然后别的需要查数据库的地方,例如list.php,action.php文件
就直接引入 db.php 文件,调用里面 $pdo 对象,
这样是不是每次访问list.php,action.php 都会重新连接一次数据库,
这样效率不是会很低?
有没有类似Java之类的,直接把 $pdo对象放spring管理,就启动的时候初始化一次,
用的时候,可以直接获取对象,之后一直不会重复连接数据库

回复列表(14|隐藏机器人聊天)
  • @Ta / 2023-05-15 / /

    @HongKongDoll 这个要看你怎么用PHP了,像你说的 java 如果我没理解错的话应该是连接池,java 常驻内存执行,所以后台维护一个连接池性能优化很大;但是像 php-fpm 这种,在一个生命周期内维护一个连接池,着实有点难为人;但是如果你用 php swoole这种常驻运行,同样可以做到你说得 java的效果。
    ~~~

  • @Ta / 2023-05-15 / /
    @㝶芾厶眵攴䭡,谢谢解答
  • @Ta / 2023-05-15 / /
    @㝶芾厶眵攴䭡,能否把正常需要初始化的全部对象,先初始化一次序列化一下存到redis中,例如pdo,然后读redis效率应该好点吧
  • @Ta / 2023-05-15 / /

    @HongKongDoll

    1. pdo 和 数据库的连接是有状态的,把它序列化隔段时间反序列化再拿出来,说实话我没试过,不知道这个状态能否维持。
    2. pdo 一次初始化是和数据库打一次交道(发生IO),假设第一条状态可维持,但是 php 和 redis 也会发生一次IO操作(即便redis响应很快)。

    连接池快的原因在于,所有状态都已经准备好了且随时可用,而且他放在程序本身的内存空间内,这速度比起你单独和Redis发生一次IO,千差万别。
    ~~~

  • @Ta / 2023-05-15 / /
    @㝶芾厶眵攴䭡,怪不到基本没什么高并发项目用php,基本java,go,python
  • @Ta / 2023-05-15 / /

    @HongKongDoll,workerman了解下,就是你说的长链接,注意内存变量也是持久性的,下一个用户会读取到上一个的变量,

  • @Ta / 2023-05-15 / /
    @胡椒舰长,好的谢谢
  • @Ta / 2023-05-16 / /
    虽然php忘光了,但谢谢哈,有用的知识+1
  • @Ta / 2023-05-17 / /
    待审核
    发言待审核,仅管理员和作者本人可见。
  • @Ta / 2023-05-17 / /

    @张小强,当使用 PHP 与 Redis 缓存进行集成时,你需要安装 Redis 扩展并配置连接到 Redis 服务器。以下是一个简单的示例代码,演示如何在 PHP 中使用 Redis 缓存:

    <?php
    
    // 连接到 Redis 服务器
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    
    // 设置缓存数据
    $key = 'my_key';
    $value = 'Hello, Redis!';
    $ttl = 3600; // 缓存有效期(以秒为单位)
    
    $redis->set($key, $value, $ttl);
    
    // 获取缓存数据
    $cachedValue = $redis->get($key);
    echo $cachedValue; // 输出: Hello, Redis!
    
    // 删除缓存数据
    $redis->del($key);
    
    // 关闭 Redis 连接
    $redis->close();
    
    ?>
    

    在示例代码中,我们首先使用 connect 方法连接到 Redis 服务器,其中 '127.0.0.1' 是 Redis 服务器的 IP 地址,6379 是 Redis 服务器的端口号。你需要根据你的 Redis 服务器配置进行相应的修改。

    然后,我们使用 set 方法将数据存储到 Redis 缓存中,需要提供一个键($key)、值($value),以及缓存的有效期($ttl)。

    接下来,我们使用 get 方法从缓存中获取数据,并将其打印到屏幕上。

    最后,我们使用 del 方法从缓存中删除指定的键($key)和关联的数据。

    最后,我们使用 close 方法关闭与 Redis 的连接。

    需要注意的是,在使用 Redis 缓存时,你还可以使用 Redis 提供的其他功能,例如使用哈希表存储复杂的数据结构、使用列表存储数据等。你可以根据自己的需求来扩展和定制示例代码。

    在实际生产环境中,你可能还需要考虑 Redis 连接的错误处理、连接池管理、序列化和反序列化数据等其他因素。以上示例代码仅供参考,并不涵盖所有的最佳实践和细节。

  • @Ta / 2023-05-17 / /
    待审核
    发言待审核,仅管理员和作者本人可见。
  • @Ta / 2023-05-17 / /

    @张小强,在 PHP 中使用 MySQL 和 Redis 配合进行查询优化和数据同步时,你可以利用 Redis 的缓存机制来减轻对数据库的查询负载,并确保数据的同步性。下面是一个简单的示例代码,演示如何在 PHP 中利用 Redis 缓存优化 MySQL 查询并保持数据同步:

    <?php
    
    // 连接到 MySQL 数据库
    $mysqlHost = 'localhost';
    $mysqlUsername = 'your_mysql_username';
    $mysqlPassword = 'your_mysql_password';
    $mysqlDatabase = 'your_mysql_database';
    
    $mysqli = new mysqli($mysqlHost, $mysqlUsername, $mysqlPassword, $mysqlDatabase);
    
    if ($mysqli->connect_error) {
        die('连接 MySQL 数据库失败: ' . $mysqli->connect_error);
    }
    
    // 连接到 Redis 服务器
    $redisHost = '127.0.0.1';
    $redisPort = 6379;
    
    $redis = new Redis();
    $redis->connect($redisHost, $redisPort);
    
    // 定义 MySQL 查询语句
    $sql = 'SELECT * FROM your_table';
    
    // 尝试从 Redis 缓存中获取查询结果
    $queryResult = $redis->get($sql);
    
    if (!$queryResult) {
        // 如果 Redis 缓存中没有查询结果,则从 MySQL 数据库查询
        $result = $mysqli->query($sql);
    
        if ($result && $result->num_rows > 0) {
            // 将查询结果转换为数组,并存储到 Redis 缓存中
            $queryResult = $result->fetch_all(MYSQLI_ASSOC);
            $redis->set($sql, serialize($queryResult));
        }
    
        $result->free();
    }
    
    // 处理查询结果
    if ($queryResult) {
        $data = unserialize($queryResult);
        
        // 在这里对查询结果进行处理或输出
        // ...
    }
    
    // 关闭 MySQL 连接
    $mysqli->close();
    
    // 关闭 Redis 连接
    $redis->close();
    
    ?>
    

    在示例代码中,我们首先通过 mysqli 连接到 MySQL 数据库,然后通过 Redis 连接到 Redis 服务器。你需要根据你的实际 MySQL 和 Redis 服务器配置进行修改。

    我们定义了一个 MySQL 查询语句 $sql,然后尝试从 Redis 缓存中获取对应的查询结果 $queryResult。如果 Redis 缓存中没有查询结果,则通过 MySQL 查询并将结果存储到 Redis 缓存中。

    在处理查询结果时,你可以根据需要进行进一步的操作或输出。

    需要注意的是,在实际应用中,你可能需要根据业务需求和数据更新频率来确定何时更新 Redis 缓存。可以使用一些触发器或事件机制来在 MySQL 数据发生变化时自动更新 Redis 缓存,以确保数据的同步性。

    此外,代码示例中并未涉及数据库连接池等高级技术,你可以根据实际需求进行相应的扩展和优化。

    请注意,在实际生产环境中,还需要考虑数据安全性、错误处理、并发访问控制等其他因素,以上示例代码仅供参考,并不涵盖所有的最佳实践和

  • @Ta / 2023-05-17 / /
    待审核
    发言待审核,仅管理员和作者本人可见。
  • @Ta / 2023-05-17 / /

    @张小强,要实现 Redis 的持久性连接,你可以使用 PHP 的 Redis 扩展提供的 pconnect 方法,它创建一个长时间保持连接的持久连接。这样可以避免在每次脚本执行时都进行连接和断开操作,提高性能和效率。下面是一个示例代码:

    <?php
    
    // 连接到 Redis 服务器
    $redisHost = '127.0.0.1';
    $redisPort = 6379;
    $redisTimeout = 0; // 持久连接超时时间,默认为无限制
    
    $redis = new Redis();
    $redis->pconnect($redisHost, $redisPort, $redisTimeout);
    
    // 在这里可以使用 $redis 对象进行 Redis 操作
    // ...
    
    // 关闭 Redis 连接(可选,因为是持久连接,可以不关闭)
    // $redis->close();
    
    ?>
    

    在示例代码中,我们使用 pconnect 方法创建一个持久连接到 Redis 服务器。pconnect 方法接受三个参数:Redis 服务器的主机名($redisHost)、端口号($redisPort)和连接超时时间($redisTimeout)。

    请注意,持久连接不会在每次请求后关闭,而是保持在后台以供以后使用。如果需要手动关闭持久连接,可以使用 $redis->close() 方法。

    使用持久连接时,需要注意以下几点:

    1. 持久连接在脚本执行期间保持打开状态,这意味着连接资源会一直占用,对于每个请求都会保持一个连接。在高并发的环境中,这可能会导致连接池资源耗尽,因此需要根据实际情况进行配置和调优。

    2. Redis 的服务器配置也需要考虑持久连接的数量。例如,在 Redis 服务器端配置文件 redis.conf 中,可以设置 maxclients 参数来限制客户端连接的最大数量。

    3. 由于持久连接不会在每次请求后关闭,所以需要注意在代码中处理异常和错误情况,以确保连接的可靠性和稳定性。

    总结来说,使用持久连接可以避免在每次脚本执行时建立和断开 Redis 连接,提高性能和效率。但是在高并发和资源有限的情况下,需要进行适当的配置和调优来保证系统的稳定性。

添加新回复
回复需要登录