【问题标题】:Possible memory leak in PHP scriptPHP 脚本中可能存在内存泄漏
【发布时间】:2016-08-21 13:21:12
【问题描述】:

我正在使用 OctoberCMS 开发一个网络应用程序,用户可以在其中选择一个项目并查看制作它所需的材料列表。一些材料也可以制作,用户可以在可制作材料附近看到一个“+”号,单击该符号可以显示另一个列表,其中包含创建材料所需的材料。

See example

问题是虽然只有一个嵌套子材质(​​如示例图像中)没有问题,但是当有多个嵌套子材质(​​例如具有可制作子材质的可制作子材质)时,服务器会返回我"Internal server error"error_log 报告:

PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 65536 bytes) in /home/federico/federicoxella.com/vendor/composer/ClassLoader.php on line 412

这是我用来从数据库中提取数据的脚本(数据库在服务器的同一台机器上)

public function onExpand()
{
    $itemID = post('item_id');

    $this->page['subitemMaterials'] =
        Item::select('federicoxella_lootbot_items.id', 'name', 'craftable')
           ->join('federicoxella_lootbot_crafts', function($join) use ($itemID)
           {
               $join->on('federicoxella_lootbot_crafts.material_1', '=', 'federicoxella_lootbot_items.id')
                    ->orOn('federicoxella_lootbot_crafts.material_2', '=', 'federicoxella_lootbot_items.id')
                    ->orOn('federicoxella_lootbot_crafts.material_3', '=', 'federicoxella_lootbot_items.id');
           })
           ->where('federicoxella_lootbot_crafts.material_result', '=', $itemID)
           ->get();
}

这个函数应该获取一个项目的 ID,从数据库中提取所有需要的材料并将它们插入一个页面变量 (subitemMaterial),看起来像这样 [{"id":3,"name":"Colla","craftable":0},{"id":4,"name":"Accendino","craftable":0},{"id":23,"name":"Metallo","craftable":0}]

如果一个项目具有"craftable":1,则会创建一个新的部分来托管创建该项目所需的材料。

这是我使用变量的部分

<ul class="no-bullet-list">
    {% for i in 0..2 %}
    <li>
        {% if subitemMaterials[i].craftable == 1 %}
        <b>{{ itemMaterial[i].name }}</b>
        <form style="display:inline;">
            <input type="hidden" name="item_id" value="{{ subitemMaterials[i].id }}" />
            <a data-request="{{ __SELF__ }}::onExpand"
                data-request-update="'{{ __SELF__ }}::subItems': '#{{ subitemMaterials[i].id }}_materials'">+</a>
        </form>
        <div id="{{ subitemMaterials[i].id }}_materials">
            {% partial __SELF__~'::subItems' %}
        </div>
        {% else  %}
        {{ subitemMaterials[i].name }}
        {% endif %}
    </li>
    {% endfor %}
</ul>

以及我声明前一个部分的部分

<div class="callout">
    <h3>{{ itemToCraft.name }}</h3>
    <ul class="no-bullet-list">
        {% for i in 0..2 %}
        <li>
            {% if itemMaterial[i].craftable == 1 %}
            <b>{{ itemMaterial[i].name }}</b>
            <form style="display:inline;">
                <input type="hidden" name="item_id" value="{{ itemMaterial[i].id }}" />
                <a data-request="{{ __SELF__ }}::onExpand"
                    data-request-update="'{{ __SELF__ }}::subItems': '#{{ itemMaterial[i].id }}_materials'">+</a>
            </form>
            <div id="{{ itemMaterial[i].id }}_materials">
                {% partial __SELF__~'::subItems' %}
            </div>
            {% else  %}
            {{ itemMaterial[i].name }}
            {% endif %}
        </li>
        {% endfor %}
    </ul>
</div>

你们能帮我理解为什么服务器返回这个错误代码吗?

【问题讨论】:

  • 我还没有尝试过,但是当前的内存限制是 PHP 默认的(我认为是 128M)。在我的脚本中没有循环,为什么第一次迭代没有引起任何问题而其他的呢?
  • 试图说 128MB 对于递归到未知/有用深度的东西来说有点低。并不是说你的程序有问题。 试图指出 - PHP 内存泄漏的可能性不大。
  • 刚刚尝试过ini_set("memory_limit", "1G"),脚本使用了所有这些.__.

标签: php laravel octobercms


【解决方案1】:

找到了问题(那不完全是问题):

实际上,我递归地添加打印页面中注入的变量值的部分。

<ul class="no-bullet-list">
    {% for i in 0..2 %}
    <li>
        {% if subitemMaterials[i].craftable == 1 %}
        <b>{{ itemMaterial[i].name }}</b>
        <form style="display:inline;">
            <input type="hidden" name="item_id" value="{{ subitemMaterials[i].id }}" />
            <a data-request="{{ __SELF__ }}::onExpand"
                data-request-update="'{{ __SELF__ }}::subItems': '#{{ subitemMaterials[i].id }}_materials'">+</a>
        </form>
        <div id="{{ subitemMaterials[i].id }}_materials">
            {% partial __SELF__~'::subItems' %}    <--- Incriminate line of code.
        </div>
        {% else  %}
        {{ subitemMaterials[i].name }}
        {% endif %}
    </li>
    {% endfor %}
</ul>

【讨论】:

    猜你喜欢
    • 2022-12-17
    • 1970-01-01
    • 2011-02-05
    • 2012-10-16
    • 1970-01-01
    • 2023-03-16
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多