我正在使用 PrestaShop 1.5 并尝试进行此 API(网络服务)调用:
example.com/api/order_histories?schema=blank
但是它返回以下错误:
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) 时遇到过此类问题,如果是,解决方案是什么?
最佳答案
我以前也遇到过这个问题。
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
添加到查询中,以便仅从数据库加载一个对象。
关于php - PrestaShop API 内存限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35447447/