我对PHP比较陌生,目前遇到了一个奇怪的问题。这个文件是从多个函数中拼接而成的,为了测试和更容易地解释问题。
这是Laravel中的基本while循环,并且似乎过早地退出了,但奇怪的是没有在循环之后退出,而是在循环之前退出,然后再次进入。我不知道原因。我已经在整个函数中添加了一些日志事件,以便尝试理解发生了什么。
直到第7页,它正确地获取并写入产品到数据库,然后我在日志中得到了“Start API Helper”事件,但从未得到“End API Helper”。所以在第7页的某个地方,某些东西导致while循环退出到上面的行,将页面计数器重置为0。然后重新进入循环,获取第一批产品,并在写入时抛出SQL重复键异常。我知道它是在循环之前退出的,因为在日志的“New Client”之后,我得到了 “Before while”。当然,页面计数器也被重置了。这是怎么发生的?
非常感谢任何帮助。
public function store()
{
$items = array();
Log::info('Before while');
$pagecount = 0;
$prodcount = 1;
while ($prodcount > 0) {
Log::info('Top of while');
$prodcount = 0; // Reset product counter
Log::info('Page Count:'.$pagecount);
Log::info('Start API Helper');
$headers = array(
'NETOAPI_KEY' => env('NETO_API_KEY'),
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'NETOAPI_ACTION' => 'GetItem'
);
Log::info('Headers Declared');
$body = '{
"Filter": {
"DateAddedFrom" : "2013-06-01 12:00:00",
"Page": "'.$pagecount.'",
"Limit": "500",
"OutputSelector": [
**Lots of JSON here - removed for readability**
]
}
}';
Log::info('Start API Helper');
$client = new client();
Log::info('New Client');
try {
$res = $client->post(env('NETO_API_URL'), [ 'headers' => $headers , 'body' => $body ]);
} catch (RequestException $e) {
echo $e->getRequest();
Log::error($e->getRequest());
if ($e->hasResponse()) {
echo $e->getResponse();
Log::error($e->getResponse());
}
}
Log::info('End API Helper');
$items = json_decode(utf8_encode($res->getBody()), true);
foreach($items["Item"] as $item)
{
// JSON is returning an empty array for empty strings. Need to convert to empty string for SQL save.
foreach($item as $key => $value){
if (empty($value)) {
$item["$key"] = "";
}
}
$Product = new Item;
$Product->SKU = array_get($item, 'SKU');
** LOTS OF DB FIELDS REMOVED FROM HERE FOR READABILITY**
$Product->save();
$prodcount++;
}
$pagecount++;
Log::info($prodcount.' products written to DB:');
Log::info('Bottom of while');
};
Log::info('Exited While');
return 'Complete';
}
更新:我已将Eloquent SQL客户端修改为firstorNew,以避免任何潜在的重复键错误。现在日志显示相同的“while exit”在第7页(偶尔第8页),然后重新进入循环在第0页,但最奇怪的是它似乎最终会有2个循环实例运行。然后最终变成3个实例,然后4个实例。然后它抛出内存耗尽异常。日志如下。
local.INFO: Page Count:1
local.INFO: Page Count:2
local.INFO: Page Count:3
local.INFO: Page Count:4
local.INFO: Page Count:5
local.INFO: Page Count:6
local.INFO: Page Count:7
local.INFO: Page Count:8
local.INFO: Page Count:0
local.INFO: Page Count:9
local.INFO: Page Count:1
local.INFO: Page Count:10
local.INFO: Page Count:2
local.INFO: Page Count:11
local.INFO: Page Count:3
local.INFO: Page Count:12
有可能是一个格式不正确的JSON API响应导致了这个问题吗?也许我会尝试将分页限制在25个左右,以便我可以访问导致循环中断的响应?