gpt4 book ai didi

php - 在 PHP 中执行的 MySQL 查询导致非常大的 httpd 线程

转载 作者:太空宇宙 更新时间:2023-11-03 12:12:22 25 4
gpt4 key购买 nike

我正在开发一个基于 MySQL 数据库的应用程序,该应用程序动态创建一个 UI,该 UI 可用于针对该数据库创建和执行查询。我目前使用的数据库包含大约 400,000 行和 77 列。

当我执行一个将返回大约一半或更多数据库的查询时,会创建一个 httpd 线程,该线程的大小会继续增长,很快就会占用我机器上的所有内存。我为创建数据库而导入的原始 CSV 只有 150MB 左右。

我正在使用适用于 PHP 的 Yii 框架进行开发。这是我的查询代码的样子:

$queryResults = 
Yii::app()->db->createCommand()
->select('*')
->from($table_name)
->where($where)
->queryAll();

在这种情况下,$where 是一个通过 AJAX 传递的值。对查询执行一些检查后,我将其发送回客户端:

$response['success'] = true;
$response['results'] = $queryResults;
echo json_encode($response);

这是一个由大型查询创建的 httpd 请求的截图:

httpd process screen shot

当进程最初创建时,它的 CPU 使用率跃升至 90% 左右。该查询保持在 1.8GB 左右的实际内存使用量,并且仍然使我的机器停止运行,直到我手动停止该过程。我工作时使用的机器只有 4GB 内存。

我不确定我做错了什么。我一直在查看 apache 是否配置不正确,或者我是否应该在 PHP 中使用无缓冲查询,但我仍然不确定我必须做什么来解决这个内存问题。任何建议将不胜感激。谢谢!

最佳答案

如果您查看代码,您实际上正在创建结果的三个副本。

  1. $queryResults 数组,这是您查询的结果。
  2. $response['results'],它是 $queryResults 的副本
  3. 由 json_encode 创建的隐式副本。

您可以尝试通过即时创建 JSON 来减少这种情况。

但是,要大大减少内存问题,请使用迭代器。

$dataProvider = new CActiveDataProvider('User');   // <-- This is the model name
$resultIterator = new CDataProviderIterator($dataProvider);
foreach($resultIterator as $userRecord) {
print_r($category);
}

引用:http://www.yiiframework.com/doc/api/1.1/CDataProviderIterator

关于php - 在 PHP 中执行的 MySQL 查询导致非常大的 httpd 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23706012/

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