PHP脚本中可能的内存泄漏

时间:2016-08-21 13:21:12

标签: php laravel octobercms

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

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>

你能帮助我理解服务器返回此错误代码的原因吗?

1 个答案:

答案 0 :(得分:0)

发现问题(这不是一个问题):

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

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