【发布时间】:2016-08-21 13:21:12
【问题描述】:
我正在使用 OctoberCMS 开发一个网络应用程序,用户可以在其中选择一个项目并查看制作它所需的材料列表。一些材料也可以制作,用户可以在可制作材料附近看到一个“+”号,单击该符号可以显示另一个列表,其中包含创建材料所需的材料。
问题是虽然只有一个嵌套子材质(如示例图像中)没有问题,但是当有多个嵌套子材质(例如具有可制作子材质的可制作子材质)时,服务器会返回我"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