私は非常に奇妙な問題があります。私は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に基づいています。
アイデア?
mysqlへの現在の接続を閉じてそれが必要なときにそれを開きますか?またこれを見てください:https://dev.mysql.com/doc/refman/5.7/en/gone-away.html – Andreas