[PHP] php5-fss для Denwer? Оптимизация str_replace

12
Unsiker
На сайте с 23.03.2009
Offline
43
#11

Сугубо по str_replace, его можно оптимизировать, примерно в 3 раза, но в мащтабе вселенной это не так существенно ))

$t1 = microtime(true);
$str='<p style="text-align: justify;"><em>16 августа камерунский футболист Самюэль Это, на данный момент принадлежащий итальянскому "Интернационале" из Милана, может перейти в <br />российский "Анжи", передает радио "Вести ФМ".</em>
<p>16 августа в полдень по местному времени в Риме, в клинике "Вилла Стюарт", Это пройдет медицинское обследование, после которого сделка по переходу в российский клуб будет оформлена официально. Представители "Анжи" уже находятся в Милане, чтобы уладить все необходимые формальности. На пресс-конференции, данной самим футболистом 13 августа в Камеруне, у него была возможность остаться в "Интере", но его переход в "Анжи" уже практически решен.</p>
<p>30-летний Это, с 2009 года выступая за "Интер", выиграл все главные турниры - национальный чемпионат и Кубок Италии, а также Лигу чемпионов.</p>
</p>';
$marker = 'выиграл все главные турниры';
$txt = explode($marker, $str);
$i=0;
if (!file_exists('content')) {mkdir('content');}
while ($i<1000)
{
$i++;
$text=implode($i, $txt);
}
$t2 = microtime(true);
echo $t2 -$t1;

А вот file_put_contents средствами php никак не оптимизируешь. Тут либо вичестер менять либо подход к програмироваю. Непонтяно для какой цели Вам 1000 одинаковых файлов? если можно держать шаблон текста и патерна поиска и уже динамически генерировать и отдавать текст.

Мне трудно теперь сохранить реальность улыбки, Еще труднее быть с кем-то самим собой.
T
На сайте с 28.06.2007
Offline
82
#12
n0name:
Пожалуйста :)
Прирост скорости в несколько раз должен быть. Или вам больше нужно?

да хотябы раз в 5-10 поднять, сейчас в моём варианте 1000 файлов генерируется за 5 минут :(

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

LEOnidUKG, а если file_put_contents в одном цикле около 7ми, не будут они конфликтовать или например ошибки с записью файлов возможны? Если бот не закончит запись, а тут ему ещё один GET запрос прилетает? :)

Unsiker, спасибо! Код для примера привёл, т.е. так то сохраняются файлы разные, я то изначально и решил что вся проблема в str_replace, так как именно эта функция преобладала в моём коде, но оказывается вот как всё повернулось :)

[Удален]
#13

Попробуйте немного поменять алгоритм работы этого рерайтера (если не ошибаюсь). В цикле формируйте один (2-3, но не 1000) файл, а вне цикла его уже пишите на диск.

T
На сайте с 28.06.2007
Offline
82
#14
pavel_j:
Попробуйте немного поменять алгоритм работы этого рерайтера (если не ошибаюсь). В цикле формируйте один (2-3, но не 1000) файл, а вне цикла его уже пишите на диск.

т.е. записывать сначало данные в массив, а потом из массива в файлы? Всёравно циклом вытаскивать элементы с массива придётся :(

[Удален]
#15
Trol:
т.е. записывать сначало данные в массив, а потом из массива в файлы? Всёравно циклом вытаскивать элементы с массива придётся :(

Нет, если эти файлы не конечный, а промежуточный этап хранения данных, то лучше один раз записать большой файл, чем 1000 раз маленькие. Если нужны именно 1000 маленьких файлов, то боюсь вы упираетесь в скорость файловой системы, и смотреть лучше именно в сторону SSD.

W
На сайте с 10.05.2009
Offline
114
#16

Весь алгоритм порочный, не держите данные в файлах во время работы скрипта а держите в переменных, а потом в конце работы сохраняйте.

B
На сайте с 25.02.2009
Offline
68
#17

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

Бесплатная CMS LitePublisher это блог, вики, тикет система, голосование (http://litepublisher.ru/) на высокой скорости с минимум памяти
T
На сайте с 28.06.2007
Offline
82
#18

Всем спасибо за внимание к проблеме.

Оказывается действительно в коде дело.

Вставил такую функцию:

function getmicrotime() 

{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}

Раскидал по коду в разных частях

echo "<br>".getmicrotime();

И выявил 2 функции, которые очень тормозили процесс, переписал их и сейчас скорость вполне приличная :)

LEOnidUKG
На сайте с 25.11.2006
Offline
1773
#19

Отпишусь уж.


<?php
set_time_limit(0);
$str='<p style="text-align: justify;"><em>16 августа камерунский футболист Самюэль Это, на данный момент принадлежащий итальянскому "Интернационале" из Милана, может перейти в <br />российский "Анжи", передает радио "Вести ФМ".</em>
<p>16 августа в полдень по местному времени в Риме, в клинике "Вилла Стюарт", Это пройдет медицинское обследование, после которого сделка по переходу в российский клуб будет оформлена официально. Представители "Анжи" уже находятся в Милане, чтобы уладить все необходимые формальности. На пресс-конференции, данной самим футболистом 13 августа в Камеруне, у него была возможность остаться в "Интере", но его переход в "Анжи" уже практически решен.</p>
<p>30-летний Это, с 2009 года выступая за "Интер", выиграл все главные турниры - национальный чемпионат и Кубок Италии, а также Лигу чемпионов.</p>
</p>';
$i=0;
if (!file_exists('content')) {mkdir('content');}
while ($i>=$_GET['start']&&$i<=$_GET['end'])
{
$text=str_replace('выиграл все главные турниры', $i, $str);
file_put_contents('./content/'.$i.'.html', $text);
$i++;
}
?>

Вызывается:

http://site.ru/script.php?start=1&end=100

следующий запускаете:

http://site.ru/script.php?start=101&end=200

и т.д.

Чтобы не замарачиваться и руками прописывать, то можно сделать 1 файлик:

<?

file_get_contents('http://site.ru/script.php?start=1&end=100');

file_get_contents('http://site.ru/script.php?start=101&end=200');

?>

и вызвать его один, а он остальные запустит сразу.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
12

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