PHP 脚本中可能存在内存泄漏

Possible memory leak in PHP script

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

See example

问题是,虽然只有一个嵌套子material(如示例图像)没有问题,但当有多个嵌套子material时(例如一个可制作的子material,它有可制作的子materials)服务器returns我"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,从数据库中提取所有需要的 material 并将它们插入页面变量 (subitemMaterial),如下所示 [{"id":3,"name":"Colla","craftable":0},{"id":4,"name":"Accendino","craftable":0},{"id":23,"name":"Metallo","craftable":0}]

如果项目有 "craftable":1,将创建一个新的部分来托管创建项目所需的 material。

这是我使用变量的部分

<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>

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

发现问题(不完全是问题):

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

<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>