我正在运行两个几乎完全相同的程序,除了一个只需要查看最低价格,第二个需要查看最低4个价格并获得平均值。我的问题是,当运行第二个程序时,我得到一个内存不足的致命错误。我的托管服务提供商为我设置了内存限制为3000M,我仍然得到错误。 这是第一个程序的代码:
$parsed_xml = amazon_xml($isbn);
$current = $parsed_xml->ListMatchingProductsResult->Products->Product;
$asin = $current->Identifiers->MarketplaceASIN->ASIN;
//print_r($asin);
// get information based on the items ASIN
$price_xml = amazonPrice_xml($asin, $ItemCondition);
$currentPrice = $price_xml ->GetLowestOfferListingsForASINResult->Product->LowestOfferListings->LowestOfferListing;
$listPrice = $currentPrice->Price->ListingPrice->Amount;
// check to see if there are values
if(!empty($listPrice))
{
//print_r($listPrice); die;
//if($currentPrice->Price->ListingPrice->Amount > 0) {
while(count($lowestPrices) < 2)
{
foreach($currentPrice as $offer){
$totalFeedback = $offer->SellerFeedbackCount;
$condition = $offer->Qualifiers->ItemSubcondition;
//amazon condition matching algorithm (so we can match our condition up against amazons conditions)
switch ($condition) {
case "New":
$amazonCondition = 5;
break;
case "Mint":
$amazonCondition = 4;
break;
case "VeryGood":
$amazonCondition = 3;
break;
case "Good":
$amazonCondition = 2;
break;
case "Acceptable":
$amazonCondition = 1;
break;
default:
$amazonCondition = 0;
} // end of switch statement
//echo $condition . "|" . $ourCondition . "|" . $amazonCondition . "|" . count($lowestPrices) . "|" . $totalFeedback . "|" . $merchantId . "<br/>";
/* default lowest 1 */
if(count($lowestPricesDefault[$a] <2)){
$lowestPricesDefault[$a] = str_replace('$','',$offer->Price->ListingPrice->Amount);
$a++;
}
if( ($ourCondition <= $amazonCondition) && ($totalFeedback >= 1500) && (count($lowestPrices) <2) )
{
$lowestPrices[$x] = str_replace('$','',$offer->Price->ListingPrice->Amount);
$x++;
}
}
$z++;
}
if(count($lowestPrices) > 0){
$avgPrice = (array_sum($lowestPrices)/count($lowestPrices)) - .10;
$source = "Amazon Condition Price";
}else{
//$avgPrice = $listPrice - ($listPrice * 0.25);
$avgPrice = (array_sum($lowestPricesDefault)/count($lowestPricesDefault)) - .10;
$source = "Default Pricing";
}
//make sure avg price is atleast 5.50, >236% of follett price, and >=200% of our cost
if($avgPrice < ($follettPrice * 2.37)){
$avgPrice = $follettPrice * 2.37;
$source = "Follett Pricing";
}
if($avgPrice < ($row['cost'] * 2)){
$avgPrice = $row['cost'] * 2;
$source = "Double Cost";
}
if($avgPrice < 5.50){
$avgPrice = 5.50;
$source = "Lowest Base Cost";
}
//update Prices
$conn->query("UPDATE inventory SET ourPrice = $avgPrice WHERE sku=" . $row['sku']);
这是第二个程序:
$parsed_xml = amazon_xml($isbn);
$current = $parsed_xml->ListMatchingProductsResult->Products->Product;
$asin = $current->Identifiers->MarketplaceASIN->ASIN;
// get information based on the items ASIN
$price_xml = amazonPrice_xml($asin, $ItemCondition);
$currentPrice = $price_xml ->GetLowestOfferListingsForASINResult->Product->LowestOfferListings->LowestOfferListing;
$listPrice = $currentPrice->Price->ListingPrice->Amount;
// check to see if there are values
if(!empty($listPrice))
{
//if($price_xml) {
while(count($lowestPrices) < 4 ) // changed count to 4 per loralee's email 5-1-2012
{
foreach($currentPrice as $offer){
$totalFeedback = $offer->SellerFeedbackCount;
$condition = $offer->Qualifiers->ItemSubcondition;
//amazon condition matching algorithm (so we can match our condition up against amazons conditions)
switch ($condition) {
case "New":
$amazonCondition = 5;
break;
case "Mint":
$amazonCondition = 4;
break;
case "VeryGood":
$amazonCondition = 3;
break;
case "Good":
$amazonCondition = 2;
break;
case "Acceptable":
$amazonCondition = 1;
break;
default:
$amazonCondition = 0;
}
//echo $condition . "|" . $ourCondition . "|" . $amazonCondition . "|" . count($lowestPrices) . "|" . $totalFeedback . "|" . $merchantId . "<br/>";
/* default lowest 4 */
if(count($lowestPricesDefault[$a] < 4)){ //changed to 4 per new pricing specs
$lowestPricesDefault[$a] = str_replace('$','',$offer->Price->ListingPrice->Amount);
$a++;
}
if( ($ourCondition <= $amazonCondition) && ($totalFeedback >= 99) && (count($lowestPrices) < 4) ) //changed to 4 per new pricing specs
{
$lowestPrices[$x] = str_replace('$','',$offer->Price->ListingPrice->Amount);
$x++;
}
}
$z++;
}
if(count($lowestPrices) > 0){
$avgPrice = array_sum($lowestPrices)/count($lowestPrices);
$source = "Amazon Condition Price";
}else{
//$avgPrice = $listPrice - ($listPrice * 0.25);
$avgPrice = array_sum($lowestPricesDefault)/count($lowestPricesDefault);
$source = "Default Pricing";
}
//make sure avg price is atleast 5.50, >236% of follett price, and >=200% of our cost
if($avgPrice < ($follettPrice * 2.37)){
$avgPrice = $follettPrice * 2.37;
$source = "Follett Pricing";
}
if($avgPrice < ($row['cost'] * 2)){
$avgPrice = $row['cost'] * 2;
$source = "Double Cost";
}
if($avgPrice < 5.50){
$avgPrice = 5.50;
$source = "Lowest Base Cost";
}
//update fillzPrice
$conn->query("UPDATE inventory SET ourPrice = $avgPrice WHERE sku=" . $row['sku']);
我在第二个程序的第86行得到了错误,这是条件行($ condition = $ offer-&gt; Qualifiers-&gt; ItemSubcondition;)有没有人知道为什么会这样?此外,有没有人有任何建议让它运行得更好?
答案 0 :(得分:1)
首先,两个代码审查点:
$a
,$x
和$z
,所有变量都没有初始条件,并且对于任何试图维护代码的人来说都是完全不透明的。单个$i
作为循环计数器通常被认为是可接受的,但良好的变量命名可以使调试更容易。$asin = $current->Identifiers->MarketplaceASIN->ASIN;
应该读取$asin = (string)$current->Identifiers->MarketplaceASIN->ASIN;
除此之外,忘记执行此操作将意味着$asin
永远不会保存到会话中(因为SimpleXML对象无法序列化。)至于你的代码失败的原因,我认为你的循环结构是错误的:
while(count($lowestPrices) < 4 )
{
foreach($currentPrice as $offer)
{
// Do something which may add to `$lowestPrices`
$z++;
}
}
首先,$z
似乎没有用于任何事情。其次,$lowestPrices
可以在foreach
循环内添加到0,1,4或甚至100次。如果它被添加到至少4次,while
循环将立即退出(因此可能不存在);如果将其添加到少于4次,则foreach
循环将仅在相同数据上再次运行。我不清楚这会使它更有可能满足while
循环的条件,给你一个无限循环。
你内存耗尽而不仅仅是CPU时间的原因是,即使$lowestPricesDefault
没有,$lowestPrices
增加了额外的数组,所以它每次都会无限期地继续增长while
循环(因此整个内部foreach
循环)重复。