1

我正在尝试为系统编写每周报告。报告的一部分将显示有关未存储在数据库中的翻译者的信息——也就是说,对于每个翻译者,我必须提取他们的数据库记录,运行一些逻辑,对于那些逻辑失败的翻译者,我将它们从数组中删除被传递给视图。

我预计视图中不会留下超过几十条记录,但数据库中只有 1,000 多条。没有办法限制从数据库中提取的数量,因为我使用的标准没有存储在那里。

我正在使用以下查询来提取所有行。但是,除非我添加一个“限制”子句并将其限制为 800 行(我对此进行了试验),否则它实际上不会返回任何结果。如果我调试结果数组,它会出现空白。我打开了调试模式,但根本没有给出任何错误,Cake 日志或 IIS 日志中也没有任何内容。

我尝试引入偏移量和限制并以块的形式循环,但是当我尝试再次将它们组合在一起时遇到了同样的问题。在这个 find 查询之后,内存使用量约为 6MB,PHP 限制设置得更高(我认为是 128MB)。

有任何想法吗?我被难住了,把头发拔了出来!

    $translators = $this->Translator->find('all', array(
            'conditions' => array(
                'OR' => array(
                    array('Translator.translators_status_id' => 1),
                    array('Translator.translators_status_id' => 2)
                )
            ),
            'fields' => array(
                'Translator.id',
                'Translator.translators_status_id',
                'Translator.first_name',
                'Translator.last_name',
                'Translator.agency_name',
                'NativeLanguage.name',
                'Country.printable_name'
            ),
            'joins' => array(
                array(
                    'table' => 'languages',
                    'alias' => 'NativeLanguage',
                    'type' => 'INNER',
                    'conditions' => array(
                        'Translator.language_id = NativeLanguage.id'
                    )
                ),              
                array(
                    'table' => 'countries',
                    'alias' => 'Country',
                    'type' => 'INNER',
                    'conditions' => array(
                        'NativeLanguage.country_id = Country.id'
                    )
                )
            )
        )
    );

编辑: 我登陆的解决方案是一次只拉 500 行。然后在每批 500 个中,我执行逻辑测试并从数组中删除行。最后,我将每个减少的批次缝合在一起。

4

2 回答 2

0

我猜你只是内存不足。这里有(或者曾经?)关于这个的非常有趣的讨论:http: //www.mail-archive.com/cake-php@googlegroups.com/msg50610.html

于 2013-07-23T15:45:39.383 回答
0

毕竟这与记忆无关。在 CakePHP 2.2(可能更高版本)中,debug()如果您的数据库排序规则未设置为 UTF-8,则该函数不能很好地处理某些 UTF-8 字符。debug()在包含这些字符的任何值的数组上运行只会以调试器的“空白”输出结束。我假设在上面的示例中,直到第 800+n 行之前我没有遇到任何有问题的字符。

现在我们的数据库排序规则设置为 UTF-8,CakePHP 设置为以 UTF-8 连接到 MySQL,这个问题已经解决了。

于 2015-06-09T13:03:38.143 回答