我有一个调用php文件的cron,并在数据库上启动了一个巨大的SQL更新。
类似的东西:
UPDATE t1 SET t1.a = (SELECT sum() FROM .... )
此查询需要几秒钟才能执行(可能是20秒)。
在查询运行时,所有其他脚本(来自http或来自cli)都会延迟。实际上这些脚本保存在session_start()函数中。
当sql查询结束时,另一个脚本(等待session_start())可以再次运行(如果它们没有达到超时)。
会话使用文件系统作为保存处理程序。
编辑:
主要步骤更好地解释:
我有2个文件
文件1:cron.php:由cron启动
cron.php:
<?php
mysql_connect('host', 'user', 'pass');
mysql_select_db('mydb');
mysql_query('UPDATE t1 SET t1.a=(SELECT SUM(t2.a) FROM t2 WHERE "some where clauses")');
mysql_query('UPDATE t1 SET t1.b=(SELECT SUM(t2.b) FROM t2 WHERE "some where clauses")');
mysql_query('UPDATE t3 SET t3.c=(SELECT SUM(t2.b) FROM t2 WHERE "some where clauses")');
文件2:index.php:http reachable
的index.php:
<?php
// index.php
echo "SESSION STARTING";
session_start();
echo "SESSION STARTED";
会发生什么:
cron启动php cron.php
有人浏览他去index.php的网站
apache启动index.php
index.php在session_start()
cron工作结束
index.php
可以正常运行
替代6.如果脚本太长,那么我可以在日志中看到以下几行:
Premature end of script headers
mod_fcgid: read data timeout in 40 seconds
这意味着脚本花了40秒尝试读取会话文件
问题是mysql查询和会话启动之间的联系是什么,以及什么可能会延迟session_start()?
服务器在Debian 7上运行。
答案 0 :(得分:0)
我的猜测您使用的是MyISAM表吗?
那些是非事务性的,如果MySQL必须获取锁(比如更新操作) - 整个表都被锁定,因此,阻止该表上的其他查询。
http://dev.mysql.com/doc/refman/5.0/en/internal-locking.html
截至session_start()
,这与您将会话存储在数据库中的解释 iif 一致。不知何故,cronjob也必须访问相应的表(它是否自己打开会话?)。