php 命令行 队列执行 限制

乏善可陈 2020-03-31 04:30:03
开发环境:centOS6.9 nginx php7.1.9 TP5.0

起因:业务要求,定时转存mysql的语句,将查询到的结果转存到插入到mongodb数据表中(一条一条执行 有更新 没有插入)
由于运营人员操作失误,没有在sql语句中 加入时间限制,导致查询数据需要耗费二十分钟左右(由于有关联其他表),之后存储数据需要一两个小时;现在需要我加入一个时间sql语句查询时长限制 和整个队列执行时间限制的功能;

执行条件:是使用supervisor + TP5自带 queue队列执行,进程中是这样
/usr/local/php/bin/php /data/sscf-manager/think queue:listen --queue AiSqlQueue --delay=0 --memory=128 --sleep=3 --tries=0 --timeout=300


本人做的尝试:
1:加入配置
ini_set("memory_limit", "512M");
ini_set("max_execution_time", "10");

我将执行时间改成一秒钟 都没有效果,但是网上的结论都是让我修改这个参数,但是还是执行半个小时不会中断

2:修改mysql查询,使用mysqli进行控制查询时长
if (!defined('MYSQLI_OPT_READ_TIMEOUT')) {
define ('MYSQL_OPT_WRITE_TIMEOUT', 10);
}
if (!defined('MYSQL_OPT_READ_TIMEOUT')) {
define ('MYSQL_OPT_READ_TIMEOUT', 10);
}
$mysqli = mysqli_init();
//$mysqli->options(MYSQLI_OPT_READ_TIMEOUT, 2);
$configDatabaseSource = config('db_config6');
$dbInfo = $configDatabaseSource['行情服务库'];
$mysqli->options(MYSQL_OPT_READ_TIMEOUT, 3);
$mysqli->options(MYSQL_OPT_WRITE_TIMEOUT, 1);
$mysqli->real_connect($dbInfo['hostname'], $dbInfo['username'], $dbInfo['password'], $dbInfo['database'], $dbInfo['hostport']);
if ($mysqli->connect_errno) {
throw new Exception('数据库连接失败!');
}
$mysqli->set_charset('utf8');

$result = $mysqli->query($sql);
$res = mysqli_fetch_all($result, 1);

上面大概的意思是 修改 MYSQL_OPT_READ_TIMEOUT 这个读取执行长度,还有的是 MYSQLI_OPT_READ_TIMEOUT执行长度,我都有过尝试没有效果;

3:TP5自带参数 --timeout=10
/usr/local/php/bin/php /data/sscf-manager/think queue:listen --queue AiSqlQueue --delay=0 --memory=128 --sleep=3 --tries=0 --timeout=10
就算我改成了10秒 但是 真正运行的时候还是远远超过10秒也不会结束;

现在这块我不知道如何才能真正限制住这个队列的执行时长了;
有没有大佬能帮忙回答一下,惭愧的是 虽然我也开发PHP有好多年了。
...全文
443 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
乏善可陈 2020-05-07
  • 打赏
  • 举报
回复
楼上的同志,后面只是做了个查询结束时间控制,没有实现查询中间断开查询
phper_jerryxu 2020-04-08
  • 打赏
  • 举报
回复
我觉得可以放个计时器,从开始查询到查询结果出来计时,在PHP代码中控制。

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧