相关疑难解决方法(0)

如何在Symfony 1.4中运行任务时使用更少的内存?

我正在使用Symfony 1.4和Doctrine.

到目前为止,我使用Symfony运行任务没有问题.但是现在我必须导入相当多的数据并将它们保存在数据库中,我才得以臭名昭着

"致命错误:允许的内存大小为XXXX字节耗尽"

在导入过程中,我只创建新对象,设置几个字段并保存它们.

我很确定这与我在保存数据时创建的对象数量有关.但是,取消设置这些对象并没有做任何事情.

是否有任何最佳实践来限制Symfony中的内存使用?

php memory doctrine symfony1 symfony-1.4

17
推荐指数
1
解决办法
4995
查看次数

在PHP中运行密集的批处理过程,并避免内存耗尽

我有几千条记录(存储在MYSQL表中的表中),我需要"批处理".所有记录都包含一个大型JSON.在某些情况下,JSON超过1MB(是的,我的数据库远远超过1GB).

我有一个功能,它抓取一条记录,解码JSON,更改一些数据,将PHP数组重新编码回JSON,并将其保存回数据库.很简单.FWIW,这是在CakePHP应用程序的上下文中.

给定一个ID数组,我试图做这样的事情(非常简单的模拟代码):

foreach ($ids as $id) {
    $this->Model->id = $id;
    $data = $this->Model->read();
    $newData = processData($data);
    $this->Model->save($newData);
}
Run Code Online (Sandbox Code Playgroud)

问题是,很快PHP就会耗尽内存.当运行这样的foreach时,几乎就像PHP从一个记录移动到下一个记录,而不释放前面操作所需的内存.

无论如何以这样的方式运行一个循环,以便在继续循环的下一次迭代之前释放内存,这样我才能真正处理大量的数据?

编辑:添加更多代码.此函数接受我的JSON,将其转换为PHP数组,进行一些操作(即根据另一个数组中的内容重新配置数据),并替换原始数组中的值.JSON有很多层深,因此极长的foreach循环.

function processData($theData) {
    $toConvert = json_decode($theData['Program']['data'], $assoc = true);
    foreach($toConvert['cycles'] as $cycle => $val) {
        foreach($toConvert['cycles'][$cycle]['days'] as $day => $val) {
            foreach($toConvert['cycles'][$cycle]['days'][$day]['sections'] as $section => $val) {
                foreach($toConvert['cycles'][$cycle]['days'][$day]['sections'] as $section => $val) {
                    foreach($toConvert['cycles'][$cycle]['days'][$day]['sections'][$section]['exercises'] as $exercise => $val) {
                        if (isset($toConvert['cycles'][$cycle]['days'][$day]['sections'][$section]['exercises'][$exercise]['selectedFolder'])) {
                            $folderName = $toConvert['cycles'][$cycle]['days'][$day]['sections'][$section]['exercises'][$exercise]['selectedFolder']['folderName'];
                            if ( isset($newFolderList['Folders'][$folderName]) ) {
                                $toConvert['cycles'][$cycle]['days'][$day]['sections'][$section]['exercises'][$exercise]['selectedFolder'] = $newFolderList['Folders'][$folderName]['id'];
                            }
                        }
                        if (isset($toConvert['cycles'][$cycle]['days'][$day]['sections'][$section]['exercises'][$exercise]['selectedFile'])) { …
Run Code Online (Sandbox Code Playgroud)

php memory json memory-management cakephp

5
推荐指数
1
解决办法
532
查看次数

学说和大量数据

我有一个返回~50k行的查询,看起来像doctrine将整个结果放入内存超出内存限制(128M)我找到的唯一解决方案是节省一些内存

$result->execute(array(), Doctrine_Core::HYDRATE_NONE);
Run Code Online (Sandbox Code Playgroud)

但是它仍然超出了限制,有没有办法一次用学说阅读一行?

php doctrine

3
推荐指数
1
解决办法
4932
查看次数

使用Symfony + Doctrine在PHP中发生内存泄漏

我正在使用PHP与Symfony框架(使用Doctrine作为我的ORM)来构建一个爬行某些网站的蜘蛛.

我的问题是以下代码生成内存泄漏:

$q = $this -> createQuery('Product p');

if($store) {
    $q
        -> andWhere('p.store_id = ?', $store -> getId())
        -> limit(1);
}

$q -> andWhere('p.name = ?', $name);

$data = $q -> execute();
$q -> free(true);
$data -> free(true);
return NULL;
Run Code Online (Sandbox Code Playgroud)

此代码放在的子类中Doctrine_Table.如果我注释掉执行部分(当然还有$data -> free(true)),泄漏就会停止.这使我得出结论,这Doctrine_Collection是导致泄漏的原因.

php memory-leaks doctrine symfony1

1
推荐指数
1
解决办法
3344
查看次数