2

我有一个调用 php 文件并在数据库上启动大量 SQL 更新的 cron。

类似的东西:

UPDATE t1 SET t1.a = (SELECT sum() FROM .... )

此查询需要几秒钟才能执行(可能需要 20 秒)。

在查询运行时,所有其他脚本(来自 http 或来自 cli)都会延迟。实际上,这些脚本包含 session_start() 函数。

当 sql 查询结束时,另一个脚本(在 session_start() 上等待)可以再次运行(如果它们没有达到超时)。

会话使用文件系统作为保存处理程序。

编辑 :

在主要步骤中更好地解释:

我有2个文件

文件 1:cron.php:由 cron 启动

  1. sql连接
  2. 庞大的 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 可达

  1. session_start()
  2. 一些代码

索引.php:

<?php

// index.php
echo "SESSION STARTING";
session_start();
echo "SESSION STARTED";

怎么了 :

  1. 一个 cron 启动php cron.php

  2. 有人浏览他访问 index.php 的网站

  3. 阿帕奇启动index.php

  4. index.php 坚持session_start()

  5. cron 作业结束

  6. index.php可以正常运行

替代 6. 如果脚本太长,那么我可以在日志中看到以下几行:

Premature end of script headers
mod_fcgid: read data timeout in 40 seconds

这意味着脚本花了 40 秒尝试读取会话文件

问题是 mysql 查询和会话开始之间的联系可能是什么,以及什么可能会延迟 session_start() ?

该服务器在 Debian 7 上运行。

4

1 回答 1

0

你正在使用 MyISAM 表?

这些是非事务性的,如果 MySQL 必须获取锁(比如更新操作)——整个表被锁定,因此阻塞了该表上的其他查询。

http://dev.mysql.com/doc/refman/5.0/en/internal-locking.html


如果您将会话存储在数据库中,那么阻止这一点将session_start()与该解释一致。并且 cronjob 也必须以某种方式访问​​相应的表(它会自行打开会话吗?)。

于 2013-08-01T13:59:26.640 回答