Как оказалось, это не имеет ничего общего с MySQL напрямую.
Неустранимая ошибка: допустимый объем памяти 134217728 байт исчерпан (попытка выделить 32000179 байт) в /home/client/public_html/phpfile.php в строке 175
Это сообщение об ошибке PHP, в котором говорится, что ваш сценарий превысил предел памяти 128M .
Вы можете увеличить предел либо в своем конфигурационном файле, либо в своем скрипте с помощью
ini_set('memory_limit','256M');
. Вы можете использовать -1
в качестве значения, чтобы полностью отключить ограничение.
Однако вы должны избегать копирования больших объемов данных.
Следующий случай ясен:
$itemAttributes=$_POST['itemAttributes'];
Вы копируете 32M данных в новую переменную. И ваш сценарий по крайней мере сейчас на 64M.
Метод execute()
с параметрами более сложен, и я не уверен, что следующее действительно верно: вы передаете новый массив как параметр
[$itemName,$itemAttributes]
Этот массив сначала должен быть создан в памяти, прежде чем он будет передан в execute()
. Это снова потребляет как минимум 32 млн. Больше. Затем из-за внутренней реализации (которую я не знаю) каждый элемент массива передается во что-то вроде bindValue()
, что снова копирует все данные. На данный момент ваш сценарий уже на пределе 128M (32 * 4).
Поэтому вы должны сделать что-то вроде следующего:
Удалите эти строки:
$itemAttributes=$_POST['itemAttributes'];
$itemName=$_POST['itemName'];
Подготовьте оператор:
$stmt = $conn->prepare("INSERT INTO $itemTable (`itemName`, `itemAttributes`) VALUES (?, ?)");
Привязать параметры с помощью bindParam :
$stmt->bindParam(1, $_POST['itemName'], PDO::PARAM_STR);
$stmt->bindParam(2, $_POST['itemAttributes'], PDO::PARAM_LOB);
bindParam()
использует вызов по ссылке , который вы можете увидеть в описании
publi c PDOStatement :: bindParam (смешанный $ параметр, смешанный & $ variable [, int $ data_type = PDO :: PARAM_STR [, int $ length [, mixed $ driver_options]]]): bool
&
в &$variable
указывает, что копирование не будет выполнено, но ссылка на вместо этого передается значение.
Обратите внимание, что я обычно не являюсь другом по ссылке и избегаю его, когда не имею дело с кодом, критичным к ресурсам. execute([..])
подходит в большинстве случаев.
Если вы хотите увидеть, сколько памяти было выделено, вы можете использовать memory_get_peak_usage () где-то в конце вашего скрипта.