gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:38:23 25 4
gpt4 key购买 nike

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

类似的东西:

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

这个查询需要几秒钟的时间来执行(可能是 20 秒)。

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

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

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

编辑:

更好地解释了主要步骤:

我有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. apache 启动 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 秒尝试读取 session 文件

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

服务器在 Debian 7 上运行。

最佳答案

猜想您正在使用 MyISAM 表吗?

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

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


关于 session_start() 上的阻塞,这与您将 session 存储在数据库中的解释iif 是一致的。而且 cronjob 也必须以某种方式访问​​相应的表(它自己打开一个 session 吗?)。

关于php - 巨大而长的 sql 查询延迟 php session_start() 直到查询结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17995258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com