PrestaShop API 内存限制

PrestaShop API memory limit

我正在使用 PrestaShop 1.5 并尝试进行此 API(网络服务)调用:

example.com/api/order_histories?schema=blank

然而returns出现以下错误:

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

调用此 URL 时:

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

工作正常。

所以我逐渐增加了我的 php.ini memory_limit 参数。最初它被设置为 32M,所以我尝试将它增加到 64M、128M,直到一直增加到 1024M。我也尝试将它设置为 2048M,但由于我只有 1GB RAM,2048M 几乎会使服务器崩溃。

在进一步研究代码之前,我只想知道是否有其他人在使用 PrestaShop (1.5.4) 时遇到过此类问题,如果遇到过,was/is 解决方案是什么?

我以前遇到过这个问题。

class WebserviceRequest 中存在一个错误,它实例化此 class 的每个对象以获得空白架构。因此,当调用包含一些条目的 class 之类的类别时,没有问题。但是当调用包含数千个条目的 class 之类的 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 添加到查询中,以便仅从数据库加载一个对象。