2016-02-17 34 views
1

我使用的Prestashop 1.5,並試圖使這個API(Web服務)電話:的PrestaShop API內存限制

example.com/api/order_histories?schema=blank 

但是它返回以下錯誤:雖然在調用此URL

Fatal error: Allowed memory size of {some numbers} bytes exhausted (tried to allocate x bytes).

http://example.com/api/categories?schema=blank 

工作得很好。

所以我逐漸增加了我的php.ini memory_limit參數。最初它被設置爲32M,所以我試圖將其高達64M,128M,直到1024M。我也嘗試將其設置爲2048M,但由於我只有1GB內存,2048M幾乎會使服務器崩潰。

在我進一步研究代碼之前,我只想知道其他人是否會遇到PrestaShop(1.5.4)的這種問題,如果是,解決方案是什麼?

回答

2

我之前有過這個問題。

WebserviceRequest中存在一個缺陷,它實例化此類的每個對象以獲得空白模式。因此,當調用像包含幾個條目的類別時,沒有問題。但是當調用像order_histories這樣的包含數千個條目的類時,它會在內存中加載數千個對象並崩潰。

但我不記得哪個方法導致這個錯誤。您應該從方法executeEntityGetAndHead開始調試並檢查方法getFilteredObjectList是否被調用。


編輯:

的方法getFilteredObjectList已更新on github

public function getFilteredObjectList() 
{ 
    $objects = array(); 
    $filters = $this->manageFilters(); 
    /* If we only need to display the synopsis, analyzing the first row is sufficient */ 
    if (isset($this->urlFragments['schema']) && in_array($this->urlFragments['schema'], array('blank', 'synopsis'))) 
     $filters = array('sql_join' => '', 'sql_filter' => '', 'sql_sort' => '', 'sql_limit' => ' LIMIT 1'); 

    $this->resourceConfiguration['retrieveData']['params'][] = $filters['sql_join']; 
    $this->resourceConfiguration['retrieveData']['params'][] = $filters['sql_filter']; 
    $this->resourceConfiguration['retrieveData']['params'][] = $filters['sql_sort']; 
    $this->resourceConfiguration['retrieveData']['params'][] = $filters['sql_limit']; 
    //list entities 
    $tmp = new $this->resourceConfiguration['retrieveData']['className'](); 
    $sqlObjects = call_user_func_array(array($tmp, $this->resourceConfiguration['retrieveData']['retrieveMethod']), $this->resourceConfiguration['retrieveData']['params']); 
    if ($sqlObjects) 
    { 
     foreach ($sqlObjects as $sqlObject) 
     { 
      if ($this->fieldsToDisplay == 'minimum') 
      { 
       $obj = new $this->resourceConfiguration['retrieveData']['className'](); 
       $obj->id = (int)$sqlObject[$this->resourceConfiguration['fields']['id']['sqlId']]; 
       $objects[] = $obj; 
      } 
      else 
       $objects[] = new $this->resourceConfiguration['retrieveData']['className']((int)$sqlObject[$this->resourceConfiguration['fields']['id']['sqlId']]); 
     } 
     return $objects; 
    } 
} 

經過這樣的修改,如果我們問一個空白模式的LIMIT 1被添加到查詢以便從數據庫僅加載一個對象。

+0

你解決了這個錯誤嗎?我很想知道你是如何提出解決方案的。同時我會嘗試你提出的解決方案。 – Jeremy

+0

我做了,但它在另一家公司,我沒有代碼了...祝你好運;) –

+0

聖母的一切好事,似乎你指着我在正確的方向。解決這個問題的方法是在查詢中添加「LIMIT = 1」,如果它請求這個github日誌中提到的空白模式:https://github.com/PrestaShop/PrestaShop/commit/b51641ca49aff8ffdc18d41e0676d339939345e8 – Jeremy