致命错误:第183行的...... \ model.php超过了30秒的最大执行时间

时间:2012-11-29 13:35:56

标签: php mysql

我在本地机器上。我只在插入|创建|删除后第一次加载页面时出现错误。然后加载速度非常快。然后,如果我修改数据库,第一次(有时是第二次)访问页面时我得到了该错误。 我不明白。

为什么我在修改数据库后第一次访问网站时才会收到错误?

$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缓存。

1 个答案:

答案 0 :(得分:1)

我会在这里给你一个疯狂的猜测:数据库缓存。

第一次执行页面时,查询不会缓存在数据库中,因此需要更长的时间,因此会使PHP的时间限制到期。

另一方面,查询要快得多。

如您所述,您可以拆分查询,也可以尝试增加脚本的时间限制:

set_time_limit(0); //No time limit
set_time_limit(60); //60 seconds

可以肯定的是,您可以使用this清理数据库缓存并始终使用它,您将始终在干净缓存上运行该页面。