我有一个调用 php 文件并在数据库上启动大量 SQL 更新的 cron。
类似的东西:
UPDATE t1 SET t1.a = (SELECT sum() FROM .... )
此查询需要几秒钟才能执行(可能需要 20 秒)。
在查询运行时,所有其他脚本(来自 http 或来自 cli)都会延迟。实际上,这些脚本包含 session_start() 函数。
当 sql 查询结束时,另一个脚本(在 session_start() 上等待)可以再次运行(如果它们没有达到超时)。
会话使用文件系统作为保存处理程序。
编辑 :
在主要步骤中更好地解释:
我有2个文件
文件 1:cron.php:由 cron 启动
- sql连接
- 庞大的 sql 查询
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 可达
- session_start()
- 一些代码
索引.php:
<?php
// index.php
echo "SESSION STARTING";
session_start();
echo "SESSION STARTED";
怎么了 :
一个 cron 启动
php cron.php
有人浏览他访问 index.php 的网站
阿帕奇启动
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 上运行。