草庐IT

php - Kohana内存泄漏?

coder 2024-04-15 原文

我这里有潜在的内存泄漏。这可能是 Kohana 的。我希望得到你的见解。 (调试这个脚本好几天了,昨晚终于放弃了)。

这是这个脚本的作用:

基本上,这是一个后台 worker (托管在 Pagodabox)。这就是为什么它是一个无限循环的原因。一步一步:

  1. 它尝试获取一篇未处理的文章
  2. 然后从相关表中获取相关信息
  3. 它将信息保存到表中 (emailerscheds)
  4. 自然地,因为只从表中获取了一篇文章记录,所以它会返回顶部并获取另一篇文章。
  5. 再次从 1 开始。

问题:在第一条记录之后内存没有被清除,最终,分配的内存,无论多么大,都会用完。我不得不认为,由于您正在处理一个新的数据库对象,因此必须清除内存。但事实并非如此。

我已经尝试了不同的方法来清除内存。我试过使变量为 NULL、unset(),我已经声明 gc_enable、gc_collect_cycles(),我试过让脚本休眠 60 秒,希望垃圾收集器能在平静的时候完成他的工作 ( wink -- 我知道我疯了)。我认为 ORM 是问题所在,所以我尝试了 DB。我试过关闭分析——顺便说一句,这有帮助,但这不是首要问题。我试过 __destruct。

内存仍然不足。

您可能会说数据集可能很大。这是。但问题是,这可以在内存耗尽之前处理大约 3 到 4 条文章记录。意思是,它实际上可以处理至少一个。我希望在 1 条记录后,内存被释放。


public function action_grab_article_topics()
{
    gc_enable();

    $x = 1;
    while ($x == 1)
    {

        // $articles = ORM::factory('article')
        //   ->where('sent', '=', 0)
        //   // ->limit(1)
        //   ->find();

        $articles = DB::select()
                ->from('articles')
                ->where('sent', '=', 0)
                ->as_object()
                ->execute()
                ->current();

        $topics = array();
        //foreach ($articles as $a)
        //{
            //$topics = $articles->topics->find_all()->as_array();
        if ($articles)
        {   
            $topics = DB::select('topic_id')
                    ->from('articles_topics')
                    ->where("article_id", '=', $articles->id);

            if (! empty($topics))
            {
                $members = DB::select('members.id', 'members.email', 'members_topics.topic_id', 'topics.topic_name')
                        ->from('members_topics')
                        ->join('members')
                        ->on('members.id', '=', 'members_topics.member_id')
                        ->join('topics')
                        ->on('topics.id', '=', 'members_topics.topic_id')
                        ->where('members_topics.topic_id', 'IN', $topics)
                        // ->limit(20)
                        ->as_object()
                        ->execute();

                foreach ($members as $m)
                {
                    $topic_id = $m->topic_id;
                    $topic_name = $m->topic_name;

                    $data = array(
                                "member_id" => $m->id,
                                "topic_id" => $topic_id,
                                "article_id" => $a->id,
                                "topic_name" => $topic_name,
                                "title" => $a->title,
                            );

                        $emailersched = ORM::factory('emailersched')->values($data)->save();

                        unset($m);

                 }

                $members->__destruct();

            //sleep(2);

            //$m = NULL;
            }

            $data = array('sent'=> time());

            $query = DB::update('articles')
                    ->set($data)
                    ->where('id', '=', $articles->id)
                    ->execute();

             // $articles->sent = time();
             // $articles->save();


            //}

         //echo "done";
            //$a = NULL;
            //$articles->__destruct();

            $articles = NULL;
            $topics = NULL;
            unset($articles);
            unset($topics);

            }

        gc_collect_cycles();
        //sleep(60);

    }
}

编辑:在我的“内存泄漏”调查中(因为我继续遇到我的代码问题),这里有一些我遇到的奇怪的东西:

http://pastebin.com/c7pc5XjW此代码在 Kohana 和 FuelPHP 上运行 - 相同的基本代码库,使用内置的 DB 模块,不使用 ORM,访问相同的数据库。燃料没用机油。它是通过公共(public) http 访问的,就像访问 Kohana 的方式一样。

此代码总共尝试处理大约 10k 条记录中的 50 条记录。

这是我对 Kohana 的内存日志:http://pastebin.com/gUiF9D2w

这是我的 FuelPHP 内存日志:http://pastebin.com/v8Pzwu77

请注意,Kohana 以 3Mb 开始,以 7Mb 结束。然而,FuelPHP 以大约 11MB 开始,但也以 11MB 结束。虽然 Kohana 起步很小,但在我看来它在这方面确实存在漏洞。

有什么想法吗?

最佳答案

您是否还确定已禁用数据库分析?

config/database.php

'profiling'    => FALSE

如果将其设置为 TRUE,这将导致大量泄漏,默认情况下是这样。

很容易错过这个设置,只更改引导文件中的主要分析设置。

关于php - Kohana内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10458771/

有关php - Kohana内存泄漏?的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  3. 键删除后 ruby​​ 哈希内存泄漏 - 2

    你好,我无法成功如何在散列中删除key后释放内存。当我从哈希中删除键时,内存不会释放,也不会在手动调用GC.start后释放。当从Hash中删除键并且这些对象在某处泄漏时,这是预期的行为还是GC不释放内存?如何在Ruby中删除Hash中的键并在内存中取消分配它?例子:irb(main):001:0>`ps-orss=-p#{Process.pid}`.to_i=>4748irb(main):002:0>a={}=>{}irb(main):003:0>1000000.times{|i|a[i]="test#{i}"}=>1000000irb(main):004:0>`ps-orss=-p

  4. ruby-on-rails - HTTParty 的内存问题和下载大文件 - 2

    这会导致Ruby出现内存问题吗?我知道如果大小超过10KB,Open-URI会写入TempFile。但是HTTParty会在写入TempFile之前尝试将整个PDF保存到内存吗?src=Tempfile.new("file.pdf")src.binmodesrc.writeHTTParty.get("large_file.pdf").parsed_response 最佳答案 您可以使用Net::HTTP。参见thedocumentation(特别是标题为“流媒体响应机构”的部分)。这是文档中的示例:uri=URI('http://e

  5. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  6. ruby-on-rails - 内存中具有相同 ID 的更多对象? - 2

    在部署在heroku上的Rails应用程序(v:3.1)中,我在内存中获得了更多具有相同ID的对象。我的heroku控制台日志:>>Project.find_all_by_id(92).size=>2>>ActiveRecord::Base.connection.execute('select*fromprojectswhereid=92').to_a.size=>1这怎么可能?可能是什么问题? 最佳答案 解决方案根据您的SQL查询,您的数据库中显然没有重复条目。也许您的类项目中的size或length方法已被覆盖。我试过find_

  7. ruby - rails 3.0.7 内存泄漏 - 2

    我的两个不同的Rails应用程序的内存有一些奇怪的问题。这两个应用程序都使用rails3.0.7。每个Controller请求分配20-30-50MB的内存。在生产模式下,这个数量减少到5-10。但这是同样的事情。这是两个应用程序使用的gem列表:gem'pg'gem'haml'gem'sass'gem'devise'gem'simple_form'gem'state_machine'gem"globalize3","0.1.0.beta"gem"easy_globalize3_accessors"gem'paperclip'gem'andand'关闭所有这些gem不会给我任何结果。我

  8. ruby - 如何强制 Ruby 释放内存给操作系统 - 2

    正如标题,我有一个处理大量数据的ruby​​程序。该程序占用了所有内存,其中调用了系统命令hostname,并且发生错误无法分配内存-主机名我试过GC.start但它不起作用。那么如何强制ruby释放未使用的内存呢?OK,这是别人的测试代码,最后报错是big_var被回收了。但是内存仍然没有释放。require"weakref"defreportputs"#{param}:\t\tMemory"+`psax-opid,rss|grep-E"^[[:space:]]*#{$$}"`.strip.split.map(&:to_i)[1].to_s+'KB'endbig_var=""#big

  9. ruby - 如何在 Ruby 中从内存中 HTTP 发布流数据? - 2

    我想上传我在运行时用Ruby生成的数据,就像从block中提供上传数据一样。我找到的所有示例仅展示了如何流式传输必须在请求之前位于磁盘上的文件,但我不想缓冲该文件。除了滚动我自己的套接字连接之外,最好的解决方案是什么?这是一个伪代码示例:post_stream('127.0.0.1','/stream/')do|body|generate_xmldo|segment|body 最佳答案 有效的代码。require'thread'require'net/http'require'base64'require'openssl'class

  10. ruby-on-rails - 如何仅修改内存中的 zip 文件? - 2

    我有一个Ruby应用程序,我需要修改现有的zip文件。我想在内存中构建zip文件并流回字节,而无需将文件写入文件系统。如果我最终在Heroku上托管它,我认为我无法写入文件系统。有谁知道这样做的方法吗?我看了Zip::ZipFile但看起来它总是想写入文件系统。我想“基于java实现”我将能够只获取压缩文件的字节,这可以在java中完成,但我看不到这样做的方法。编辑:我要问的与此基本相同,但针对Ruby而不是Python:Functiontocreatein-memoryzipfileandreturnashttpresponse 最佳答案

随机推荐