2016-08-21 21 views
2

私は、ユーザがアイテムを選択して工作するのに必要なマテリアルの一覧を見ることができるOctoberCMSを使用してWebアプリケーションを開発しています。いくつかのマテリアルも作成することができ、ユーザは、マテリアルを作成するために必要なマテリアルをクリックして他のリストを表示することができる、作成可能なマテリアルの近くにある "+"記号を見ることができます。PHPスクリプトでメモリリークが発生する可能性があります

See example

問題は、(例えば、画像のように)一つだけのネストされた副材料がある間は問題がないことであるが、場合つ以上のネストされた副材料が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> 

と部分を使用するところでは部分的ですコード?

+0

私はまだ試していませんでしたが、現在のメモリの上限はPHPのデフォルト(128Mだと思います)です。私のスクリプトにはループがありません。最初の反復では何の問題も起こりません。 –

+0

未知の/有用な深さに再帰する何かのために、それが少し低い128MBと言うことを試みていました。あなたのプログラムに間違いがあったということではありません。 _を指摘しようとしています。PHPのメモリリークは起こりそうにありません._ –

+0

'ini_set(" memory_limit "、" 1G ")'を試してみました。 –

答えて

0

は(正確に問題があるではないという)問題が見つかりました:

Pratically私は再帰的にページ内に注入された変数の値を印刷するパーシャルを追加しています。

<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> 
関連する問題