Подскажите с ПХП

12
gerkon
На сайте с 21.10.2005
Offline
40
#11

Проблема не в этом. Я уже сталкивался с проблемой

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 35 bytes) in C:\Program Files\VertrigoServ\www\FC\replase\replase.php on line 11

раньше, когда парсил файлы партнёрских магазинов. Файл в 5 мегабайт парсился, в 19 мегабайт - выдавал такую ошибку.

Проблема заключается в том, что лимит памяти на один процесс устанавливается хостером - и использовать скрипты, использующие функцию file() с большими файлами не представляется возможным, так как file() читает сразу весь файл в массив и забивает оперативку.

Проблема решается использованием другого пути - вот выкладываю - может кому-нибудь пригодится:

<?php

/**

* @author Gerkon

* @copyright 2008

*/

// Текстовый файл.

$file = "testfile.txt";

// Временный файл, который будет создаваться при работе скрипта.

$tmpfile = "testfile2.txt";

// Проверяем файл на доступность, чтобы не плодить мегабайты error_log'a

if (!file_exists($file))die("Исходного файла не существует!!");

// Открываем файл

$handle = fopen($file, "r");

// Создаем временный файл

$temp = fopen($tmpfile,"w+");

// До конца файла

while (!feof($handle)) {

// Читаем каждуюстроку

$buffer = fgets($handle, 14096); // Строка не должна быть больше 14096 байт! Если больше - меняем значение!

// Проверяем есть ли <H1> в начале и </H1> в конце

if (eregi("^<h1>",$buffer) && !eregi("</h1>",$buffer))

// Тогда добавляем закрытый тег

$buffer = str_ireplace("\n","</h1>\n",$buffer);

// И записываем строку во временный файл

fputs($temp,$buffer);

}

// Закроем дескрипторы файлов

fclose($handle);

fclose($temp);

// Удалим старый файл

unlink($file);

// Переименуем новый файл

rename($tmpfile,$file);

echo "Операция успешно выполнена!";

?>

C уважением, Андрей. Пользуюсь этим хостингом уже 4 года! (http://www.replay.ru/index.php?part_id=3600) Ведущий манул Pixshock.net (http://www.pixshock.net)
WhiteFalke
На сайте с 16.09.2007
Offline
184
#12
gerkon:
Проблема не в этом. Я уже сталкивался с проблемой
Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 35 bytes) in C:\Program Files\VertrigoServ\www\FC\replase\replase.php on line 11
раньше, когда парсил файлы партнёрских магазинов. Файл в 5 мегабайт парсился, в 19 мегабайт - выдавал такую ошибку.

Проблема заключается в том, что лимит памяти на один процесс устанавливается хостером - и использовать скрипты, использующие функцию file() с большими файлами не представляется возможным, так как file() читает сразу весь файл в массив и забивает оперативку.

Проблема решается использованием другого пути - вот выкладываю - может кому-нибудь пригодится:

<?php

/**
* @author Gerkon
* @copyright 2008
*/
// Текстовый файл.
$file = "testfile.txt";
// Временный файл, который будет создаваться при работе скрипта.
$tmpfile = "testfile2.txt";

// Проверяем файл на доступность, чтобы не плодить мегабайты error_log'a
if (!file_exists($file))die("Исходного файла не существует!!");
// Открываем файл
$handle = fopen($file, "r");
// Создаем временный файл
$temp = fopen($tmpfile,"w+");

// До конца файла
while (!feof($handle)) {
// Читаем каждуюстроку
$buffer = fgets($handle, 14096); // Строка не должна быть больше 14096 байт! Если больше - меняем значение!
// Проверяем есть ли <H1> в начале и </H1> в конце
if (eregi("^<h1>",$buffer) && !eregi("</h1>",$buffer))
// Тогда добавляем закрытый тег
$buffer = str_ireplace("\n","</h1>\n",$buffer);
// И записываем строку во временный файл
fputs($temp,$buffer);
}
// Закроем дескрипторы файлов
fclose($handle);
fclose($temp);
// Удалим старый файл
unlink($file);
// Переименуем новый файл
rename($tmpfile,$file);
echo "Операция успешно выполнена!";

?>

Да, вот этот код работает лучше чем тот который я привел.

gerkon
На сайте с 21.10.2005
Offline
40
#13

Более того - попробуйте его на VertrigoServ - я уверен, он не будет выдавать Fatal Error. Это очень удобно тем, что его можно использовать на любых хостингах.

WhiteFalke
На сайте с 16.09.2007
Offline
184
#14
gerkon:
Более того - попробуйте его на VertrigoServ - я уверен, он не будет выдавать Fatal Error. Это очень удобно тем, что его можно использовать на любых хостингах.

Все верно, ошибку не выдавал и на нем. Спасибо!

gerkon
На сайте с 21.10.2005
Offline
40
#15

Всегда пожалуйста ;)

WhiteFalke
На сайте с 16.09.2007
Offline
184
#16

Есть еще 1 нужный скриптик для разбивки текста.

Имеем текст, его разбить на равные кусочки нужно.

Например по 3000 символов, этот параметр задается.

Далее, построчно считываем каждую строку, и суммируем кол-во символов, желательно без учета пробелов. Как только сумма >3000 вставляем новую строку, текст которой тоже что бы можно было менять, напрмиер "Часть 1", слово задается, а вот цифирка рядом задается соответственно тому какая это часть.

Почему именно >3000 а не ровно 3000, просто что бы он целиком считывал строку, а не обрывал на полуслове..

Может кто напишет? Буду признателен. Ну не селен я в ПХП :(

gerkon
На сайте с 21.10.2005
Offline
40
#17

Стукните в аську 323918. Помогу.

WhiteFalke
На сайте с 16.09.2007
Offline
184
#18

Вопрос решен усилиями - gerkon, спасибо.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий