Ситуация такова, что у меня есть массив из 15000 записей, и каждая запись имеет 67 парных значений ключа. Теперь я хочу обновить все значения с помощью trim, str_replace или type-cast, но я получаю ошибку утечки php памяти. Я не понимаю, почему это происходит. Мой формат массива такой
Array
(
[0] => Array
(
[id] => 1
[parent_id] => 1
[login] => 123
[login_nickname] =>
[password] => 123
[subuser] => 0
[subuser_id] =>
[email] => [email protected]
),
[1] => Array
(
[id] => 1
[parent_id] => 1
[login] => 123
[login_nickname] =>
[password] => 123
[subuser] => 0
[subuser_id] =>
[email] => [email protected]
)
)
В этом массиве у меня есть некоторые поля, такие как комментарии, адрес, и я хочу, чтобы они обрезались, str_replace, некоторые поля, такие как ветви (массив), я хочу привести его к типу в объекте. Но когда я это делаю, я получаю ошибку памяти, превышающую, как это
Ошибка Fatel: Допустимый объем памяти 134217728 байт исчерпан (попытался выделить 49 байт) в вар / WWW / HTML / MyProject / приложение / модель / Member.php онлайн 28
FYI: Когда я повторяю эти значения в цикле с использованием этих функций (trim, str_replace, type-cast и т. Д.), Тогда цикл работает нормально и успешно печатает его значение.
Я не понимаю, в чем проблема, пожалуйста, помогите мне.
Мой цикл foreach примерно такой
foreach($member_list as $index=>$member){
foreach($member as $key=>$value){
$member_list[$index][$key] = str_replace(array("\n", "\t", "\r"), " ", trim($value));
}
}
Эта ошибка происходит в этом цикле.
Эта проблема в основном связана с тем, что PHP-скрипт потребляет много памяти. В вашем случае, поскольку объем данных слишком велик, даже проблема тайм-аута шлюза 504 начнет появляться довольно часто. Вы должны либо использовать технику пакетной обработки (фоновой обработки), либо выполнить свой сценарий, используя CLI или curl. Эти два метода являются хорошо зарекомендовавшими себя методиками в мире PHP для обработки больших запущенных заданий
Дело в том, что str_replace на самом деле довольно дорогой метод для использования. Если вы профилируете свой код (используя такой инструмент, как xhprof (http://pecl.php.net/package/xhprof), вы увидите, насколько дорог этот метод на самом деле с точки зрения использования процессора PHP. В завершение (и я думаю, что это ваша настоящая проблема), поскольку вы просматриваете и присваиваете значения, вы удваиваете память, и именно там вы, скорее всего, столкнетесь с проблемой (проблема, которую вы не видите, когда повторяя значения).
Если вам все еще нужно запустить цикл, увеличьте лимит памяти. Вы можете сделать это либо в файле php.ini (а затем перезапустить Apache), либо в начале своего скрипта поместить следующий код:
ini_set('memory_limit','256M')
Это увеличит доступную для PHP память до 256 МБ. Возможно, вам придется добавить больше, но в конечном итоге вам будет достаточно для обработки всего массива.
С другой стороны, рассмотрите возможность исправления данных, которые поступают в вашу БД, если, конечно, вы делаете это только для определенной цели.
—Просто чтобы обновить это с примерами использования памяти —
ПРИМЕР 1:
Выполнение следующего кода на http://sb.meezaan.net/so/32195660/t1.php использует около 43 000 байтов.
<?php
$x = [];
// create array.
$i = 0;
for($i=0; $i<=1000; $i++) {
$x[$i]['id'] = $i;
$x[$i]['name'] = rand(10909090,999999999999999);
$x[$i]['time'] = time();
$x[$i]['readable'] = date('r', time());
}
$start = memory_get_usage();
foreach ($x as $k => $v) {
foreach ($v as $key => $val) {
$x[$k][$key] = str_replace(1,2, $val);
}
}
$end = memory_get_usage();
$used = $end - $start;
var_dump('Memory consumed: ' . $used);
ПРИМЕР 2:
Выполнение следующего кода на http://sb.meezaan.net/so/32195660/t2.php использует около 770 байт (прокрутите вниз, чтобы увидеть результат).
<?php
$x = [];
// create array.
$i = 0;
for($i=0; $i<=1000; $i++) {
$x[$i]['id'] = $i;
$x[$i]['name'] = rand(10909090,999999999999999);
$x[$i]['time'] = time();
$x[$i]['readable'] = date('r', time());
}
$start = memory_get_usage();
foreach ($x as $k => $v) {
foreach ($v as $key => $val) {
echo str_replace(1,2, $val) . '<br />';
}
echo '---<br />';
}
$end = memory_get_usage();
$used = $end - $start;
var_dump('Memory consumed: ' . $used);