2017-07-29 3 views
0

私は非常に奇妙な問題があります。私はzendフレームワークに基づいたショップで働いています。私はいくつかのオークションサービス(allegro.pl)との統合を作成しています。私はすべてのアイテムを石鹸でダウンロードする必要があります。私の機能が終了した後、私は "MySQLサーバーがなくなった"ことになる。ここでMySQLサーバーがなくなった - Zend

は私のコードです:

private function getProducts() 
    { 
     $items = []; 
     $filterOptions = /* doesn't matter for this question */; 
     $allegroItems = $this->allegro->getCore()->doGetItemsList(0, 1, $filterOptions, 3, null); 

     $itemsCount = $allegroItems->itemsCount; 
     $perPage = 1000; 
     $maxPage = ceil(round($itemsCount, 0)/$perPage); 

     for ($i = 0; $i < $maxPage; $i++) { 
      $allegroItems = $this->allegro->getCore()->doGetItemsList($perPage * $i, $perPage, $filterOptions, 3, null)->itemsList->item; 

      if (!is_array($allegroItems)) { 
       $allegroItems = [$allegroItems]; 
      } 

      foreach ($allegroItems as $item) { 
       $items[(string)$item->itemId] = $item; 
      } 
     } 

     return $items; 
    } 

〜3000個の項目は現在ありません。 2500〜3000件以上のアイテムをダウンロードするとエラーになります(正確な数値は計算されませんでした)。 $ perPageを1,100または1000に設定しても問題ありません。実行時間に依存しません。スリープ(100)を設定し、エラーなしで1000の製品をダウンロードできます。この関数の最後の行の直前に問題なくDBクエリを呼び出すことができますが、フレームワークの組み込み関数がタスクテーブルを更新しようとするとエラーが発生します。

エラーは何も依存していないようです...実行時間(時間は〜30秒で、スリープ(100)でうまくいきます)ではなくメモリ制限(各ループの変数を設定解除するか、助けにならなかった)、石鹸機能の実行時間ではなかった(数分かかるものの、2000項目を1つずつダウンロードするとうまくいく)。そして、私にとって最も奇妙なのは、dbクエリは、私が言ったように最後の行の直前にその関数の中で作業しているということです。

私は明確なzendフレームワークを使用していませんが、 "shoper"はzendに基づいています。

アイデア?

+0

mysqlへの現在の接続を閉じてそれが必要なときにそれを開きますか?またこれを見てください:https://dev.mysql.com/doc/refman/5.7/en/gone-away.html – Andreas

答えて

1

問題はBLOBデータで問題でした。増加するmax_allowed_pa​​cketはそれを解決しました。しかし、私は完全に独立した関数としてそれを書いたので、そのBLOBに何があったのか、私の関数がどのように影響を与えているのか分かりません:-)

関連する問題