1

也许我在这里遗漏了一些简单的东西......或者我只是在这方面编码了很长时间我看不到我的问题,但是使用 CakePHP (1.3) 和做一个选择 (MySQL) 应该能够返回即使有 2,000 条记录的结果......对吗?

$options = array(
    'conditions' => array(
        'Lead.campaign_id' => $campaign['Campaign']['id']
    ),
    'recursive' => -1,
    'order' => 'Lead.goal DESC',
    'contain' => false,
);

$leads = $this->Lead->find('all',$options);

然而,这个查询给了我一个白屏死机(带define('LOG_ERROR', 2);设置)。

如果我'limit' => 300,在数组中添加一个(或类似的数字......不必正好是 300),$options那么它将提取结果,所以我知道查询本身不是问题。

此外,我尝试通过使用数组中的'fields'参数来限制返回的列$options......甚至告诉它只返回 1 个字段,但这也不起作用。

我还回显了它使用的 SQL 语句 via

$log = $this->Lead->getDataSource()->getLog(false, false);
debug($log);

当然,我必须'limit'输入它才能显示(否则我只会得到白屏死机)。然后我将该查询(无限制)复制/粘贴到 phpMyAdmin 中,它会很好地返回记录(即使打开“显示 1,000 行”)。这样做让我相信系统可以处理查询和输出,但也许我在做一个我不应该做的假设。

我试图获取所有行而不对记录进行分页的原因是因为我需要将它们输出到 csv 文件以供用户下载(这部分已经在工作......查询工作时)。

有人向我建议这可能是一个超时问题,我应该提出这个问题,但这对我来说似乎是一个黑客,必须有一个更好的解决方案。

由于我正在下载 csv 文件,也许有一种方法可以将查询流式传输到然后下载的文件?或者也许有更好的解决方案?

4

1 回答 1

2

您可能内存不足(检查您的 Web 服务器错误日志) - Cake 会将所有 2000 行加载到一个数组中,这可能会超出您的脚本内存限制。

您可以提高脚本内存限制,但还有其他选择:

你真的需要取回所有 2000 行吗?向用户显示这么多数据对于用户来说将是不可理解的。分页在这里会更好吗?

如果您打算根据所有数据进行计算,也许您可​​以重新编写查询以在查询中进行计算?

如果您必须使用 PHP 来处理数据,请将其分块取回(例如一次 100 条记录)。如果该过程可能需要很长时间,您可能需要将脚本超时设置为较高的值...

于 2012-08-24T14:10:18.627 回答