巨大和长sql查询延迟php session_start()直到查询结束

时间:2013-08-01 13:21:10

标签: php mysql

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

类似的东西:

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

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

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

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

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

编辑:

主要步骤更好地解释:

我有2个文件

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

  1. sql connection
  2. 巨大的SQL查询
  3. 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

    1. 在session_start()
    2. 一些代码
    3. 的index.php:

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

      会发生什么:

      1. cron启动php cron.php

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

      3. apache启动index.php

      4. index.php在session_start()

      5. 上成立
      6. cron工作结束

      7. index.php可以正常运行

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

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

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

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

        服务器在Debian 7上运行。

1 个答案:

答案 0 :(得分:0)

我的猜测您使用的是MyISAM表吗?

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

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


截至session_start(),这与您将会话存储在数据库中的解释 iif 一致。不知何故,cronjob也必须访问相应的表(它是否自己打开会话?)。