Я получаю «память исчерпана» в моем PHP скрипте. Я не могу понять, почему. Предел составляет 128 МБ. Я отправляю из javascript xmlrequest () строку json размером не более 10 МБ (обычно менее 1 МБ). Сам сценарий PHP имеет размер 43 КБ. Даже копируя все дюжину раз, я не должен исчерпывать память. Я делаю несколько обращений к базе данных в getParentFolders (), но это производит только несколько строк. Конечно, не те 62 мегабайта, которые я использую. Я использовал Xdebug (см. Рисунок), но это не говорит мне ничего полезного, только то, что да, я использую много памяти.
Так что на данный момент я пытаюсь применить «лучшие практики», чтобы минимизировать память Применение. Простое исправление, как я думал, заключалось в передаче значений по ссылке. Поэтому я ставлю '&' перед каждой переменной в каждой функции. К моему удивлению, потребление памяти не изменилось. На самом деле, было несколько хуже на несколько байтов. Я также пытался использовать каждую переменную как глобальную, но опять же, к моему удивлению, разницы было мало.
Так что же происходит? Почему переход по ссылке и использование глобальных переменных не дает ожидаемого выигрыша в производительности? (см. изображения)
Xdebug 'проход по значению'
Xdebug "проход по ссылке"
Обратите внимание, что они в значительной степени идентичны.
Для тех, кто хочет получить код, есть функция getParentFolders (), которая возвращает только короткую строку, но каким-то образом использует 70Mb!
function getParentFolders(&$node) { //returns a string of folders
debugprint("GetParentFOlders()"); //prints if $DEBUG flag is on
$parent = getParent($node);
$path = "";
while ($parent) { //goes till we hit root folder
$path = $parent->title . '/' . $path; //prepend it
$parent = getParent($parent);
}
return $path;
}
function getParent(&$node) { //return node that is the parent
global $email;
$parentId = $node->parentId;
$clientId = $node->parentClient;
$idCol = $clientId . "_id";
$tablename = $email . "_bookmarks";
$query = "SELECT * FROM `$tablename`
WHERE $idCol = '$parentId'"; //only return one row since id is unique
$result = sendquery($query);
return (object) $result[0];
}
Редактировать:
Просто чтобы уточнить, я ищу техническое объяснение PHP использования памяти и лучшие практики - в частности, почему я не вижу различий в памяти - нет Обойти эту проблему.