私は、ユーザがアイテムを選択して工作するのに必要なマテリアルの一覧を見ることができるOctoberCMSを使用してWebアプリケーションを開発しています。いくつかのマテリアルも作成することができ、ユーザは、マテリアルを作成するために必要なマテリアルをクリックして他のリストを表示することができる、作成可能なマテリアルの近くにある "+"記号を見ることができます。PHPスクリプトでメモリリークが発生する可能性があります
問題は、(例えば、画像のように)一つだけのネストされた副材料がある間は問題がないことであるが、場合つ以上のネストされた副材料がcraftableを有している(例えばcraftable副材料があります副資材)サーバがと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
は、これは私がデータベースからデータを抽出するために使用しているスクリプトです(データベースがサーバーの同じマシン上にあります項目が新しい"craftable":1
を持っている場合)
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":3,"name":"Colla","craftable":0},{"id":4,"name":"Accendino","craftable":0},{"id":23,"name":"Metallo","craftable":0}]
のように見えるもの)、アイテムのIDを取り、データベースから必要なすべての材料を抽出し、(ページ変数にsubitemMaterial
それらを挿入する必要があります部分を作成してアイテムを作成するために必要なマテリアルをホストします。
そして、これは私があなたたちは、サーバーがこのエラーを返した理由を私は理解することができ、前の部分
<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>
を宣言どこに変数
<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>
と部分を使用するところでは部分的ですコード?
私はまだ試していませんでしたが、現在のメモリの上限はPHPのデフォルト(128Mだと思います)です。私のスクリプトにはループがありません。最初の反復では何の問題も起こりません。 –
未知の/有用な深さに再帰する何かのために、それが少し低い128MBと言うことを試みていました。あなたのプログラムに間違いがあったということではありません。 _を指摘しようとしています。PHPのメモリリークは起こりそうにありません._ –
'ini_set(" memory_limit "、" 1G ")'を試してみました。 –