作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的测试运行得很慢...我进行了不到 100 次测试,但在快速机器上运行仍然需要 10 秒以上。我尝试禁用代码覆盖率,并对我所做的几件事使用缓存(例如 LDAP)。
在 PHPUnit 运行时分析测试会产生:
整整 10% 的运行时间(其中包括收集信息和生成大量代码覆盖页面的时间)都花费在 mysqli->prepare
上。不幸的是,我无法在这里抽象数据库。我不仅有效地测试了数据库访问层本身,而且还根据被测代码内的 JOIN
实现了很多逻辑。
是否有任何我可以更改的配置设置或任何类似性质的内容以使速度更快? prepare
是否需要调用 mysql 服务器(因此设置本地 mysql 服务器进行测试可能会有所帮助?)
最佳答案
是的,prepare()
语句将调用 MySQL 服务器。准备好的语句在服务器端通过两个调用执行:PREPARE
调用和 EXECUTE
调用。
每个示例:
mysql> PREPARE stmt1 FROM 'SELECT * FROM mysql.user';
mysql> EXECUTE stmt1;
对于任何驱动程序都是如此,无论是 PHP 驱动程序还是 JDBC 驱动程序。为了进一步证明它确实进行了调用,请执行以下代码:
$mysqli->prepare('SELECT * FROM mysql.user');
...您可以在 MySQL 中看到以下内容:
mysql> show processlist;
+-----+------+-----------+------+---------+------+-------+--------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+------+-----------+------+---------+------+-------+--------------------------+
| 564 | root | localhost | NULL | Query | 0 | NULL | show processlist |
| 565 | root | localhost | NULL | Prepare | 0 | NULL | SELECT * FROM mysql.user |
+-----+------+-----------+------+---------+------+-------+--------------------------+
2 rows in set (0.00 sec)
为了加速这一过程,您可以在本地计算机上使用UNIX 域套接字(假设您有 POSIX 操作系统)。这消除了 TCP 握手和纠错的开销,以及网络延迟,因为它是在本地执行的。
然而,实际上最好的解决方案是使用模拟对象抽象数据库连接,但您已经知道这一点。如果单元测试必须连接到数据库,那么它就不是单元测试:它是集成测试。
关于php - 有没有办法提高 mysqli->prepare 的执行速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7728064/
我是一名优秀的程序员,十分优秀!