我在本地机器上。我只在插入|创建|删除后第一次加载页面时出现错误。然后加载速度非常快。然后,如果我修改数据库,第一次(有时是第二次)访问页面时我得到了该错误。 我不明白。
为什么我在修改数据库后第一次访问网站时才会收到错误?
$sth = $this->dbh->prepare("SELECT g.t_tree_c_parent AS gp ,h.t_tree_c_parent AS hp
FROM t_tree a INNER JOIN (t_data b, t_data c, t_tree d, t_data e, t_data f, t_tree g, t_tree h, t_tree i)
ON a.t_tree_c_child=b.t_data_c_space
AND b.t_data_c_object=c.t_data_c_object
AND c.t_data_c_space=d.t_tree_c_child
AND d.t_tree_c_parent=e.t_data_c_object
AND e.t_data_c_space=f.t_data_c_object
AND f.t_data_c_space=g.t_tree_c_child
AND g.t_tree_c_parent=h.t_tree_c_child
AND e.t_data_c_space=i.t_tree_c_child
AND i.t_tree_c_parent=?
WHERE a.t_tree_c_child=?");
$sth->execute(array($this->glob['children'], $child)); // <- LINE:183
我将拆分该查询以进行测试。但我想问我可能错过了什么。
更新@jcho360问道:
CREATE TABLE `t_data` (
`t_data_c_space` VARCHAR(50) NOT NULL DEFAULT '0.00000000000',
`t_data_c_object` VARCHAR(50) NULL DEFAULT NULL,
`t_data_c_timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`t_data_c_space`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
CREATE TABLE `t_tree` (
`t_tree_c_parent` VARCHAR(50) NOT NULL,
`t_tree_c_child` VARCHAR(50) NOT NULL,
`t_tree_c_timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
在HeidiSQL中为一个孩子(在项目中这个查询是递归函数):
2.137秒,这是db中的一次小更新后的第一次,然后是0.000秒
我开始认为这是由Leandro Barreto吮吸的mysql缓存。
答案 0 :(得分:1)
我会在这里给你一个疯狂的猜测:数据库缓存。
第一次执行页面时,查询不会缓存在数据库中,因此需要更长的时间,因此会使PHP的时间限制到期。
另一方面,查询要快得多。
如您所述,您可以拆分查询,也可以尝试增加脚本的时间限制:
set_time_limit(0); //No time limit
set_time_limit(60); //60 seconds
可以肯定的是,您可以使用this清理数据库缓存并始终使用它,您将始终在干净缓存上运行该页面。