[PHP] тормоза...

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35420
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

[PHP] тормоза...

Непрочитанное сообщение Alex Keda » 2008-05-28 22:12:49

имею такой кусок кода

Код: Выделить всё

$text = str_ireplace($model_marka_array, $model_marka_links_array, $text);
тексту немного - несколько килобайт.
массивы - 16182 значения в каждом, простые, не знаю как правильно называется, делал так:

Код: Выделить всё

array_push($model_marka_array, trim($var));
обработка занимает 1.4 секунды... машина - amd64 2 c чем-то гигагерца (эта машина, на которой сайт).
str_replace быстрей чем str_ireplace в два с лишним раза...
однако - и это много на мой взгляд.
есть более хорошие решения?
==========
легенда. есть текст типа "Новая Mazda 6 экономичней старой...." - так вот после обработки этой функцией будет:

Код: Выделить всё

Новая <a href="....">Mazda 6</a> экономичней старой....
может есть способ лучше?
Убей их всех! Бог потом рассортирует...

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: [PHP] тормоза...

Непрочитанное сообщение zg » 2008-05-29 7:25:37

lissyara писал(а):может есть способ лучше?
есть, можно снизить время работы до тысячных долей секунды

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35420
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: [PHP] тормоза...

Непрочитанное сообщение Alex Keda » 2008-05-29 8:08:52

zg писал(а):
lissyara писал(а):может есть способ лучше?
есть, можно снизить время работы до тысячных долей секунды
вы часом не из Англии?
Там тоже любят давать полноценные но при этом полностью бесполезные советы...
Убей их всех! Бог потом рассортирует...

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: [PHP] тормоза...

Непрочитанное сообщение zg » 2008-05-29 8:20:08

lissyara писал(а):вы часом не из Англии?
Там тоже любят давать полноценные но при этом полностью бесполезные советы...
нет, не из англии

ты чего от меня хочешь? если код, то выкладывай код, если решения, выкладывай алгоритм, если просто рассуждений на тему, то я уже порассуждал. Данный топик это рассуждение на тему "массивы", ты спросил можно, я ответил можно... чего ещё надо? ))))

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35420
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: [PHP] тормоза...

Непрочитанное сообщение Alex Keda » 2008-05-29 8:27:07

lissyara писал(а):имею такой кусок кода

Код: Выделить всё

$text = str_ireplace($model_marka_array, $model_marka_links_array, $text);
тексту немного - несколько килобайт.
массивы - 16182 значения в каждом, простые, не знаю как правильно называется, делал так:

Код: Выделить всё

array_push($model_marka_array, trim($var));
обработка занимает 1.4 секунды...
собственно код. место которое тормозит.
инетерсует содержимое массивов?
я конечно могу записать в файл и выложить - но думаю от этого пользы не будет.
какой ещё нужен код?
синтаксис функции str_ireplace известен, массивы любые, одинакового размера, тест любой.
===========
всё-таки вы из англии =)))
Убей их всех! Бог потом рассортирует...

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: [PHP] тормоза...

Непрочитанное сообщение zg » 2008-05-29 8:34:49

lissyara писал(а):всё-таки вы из англии =)))
Лис, у тебя серьёзные проблемы с логикой работы, поэтому ошибка не в использовании функции str_ireplace, а в той сруктуре, где она используется, я на 99% уверен, что эту функцию вообще можно исключить из кода, либо делать обработку однократно.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35420
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: [PHP] тормоза...

Непрочитанное сообщение Alex Keda » 2008-05-29 8:49:00

обработка делается однократно
одно выполнение занимает более секунды.
заменить - пока тока до кэширования результатов додоумался - но там сложные навороты с админкой получаются - чтобы измения запеленговать....
=========
есть лучший метод заменить вхождения в тесте?
Убей их всех! Бог потом рассортирует...

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: [PHP] тормоза...

Непрочитанное сообщение zg » 2008-05-29 8:56:41

lissyara писал(а):есть лучший метод заменить вхождения в тесте?
в BBCode интересно сделано

без кода трудно сказать...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35420
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: [PHP] тормоза...

Непрочитанное сообщение Alex Keda » 2008-05-29 9:02:45

bbcode юзает тоже самое - по возможности str_replace - когда невозможно preg_* - поскольку первый значительно быстрей.
=========
код - ща солью массивы в текстовые файлы, текстик и настругаю образец на php в десяток строк.
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35420
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: [PHP] тормоза...

Непрочитанное сообщение Alex Keda » 2008-05-29 9:41:37

во.
Вложения
test_time.tar.gz
(173.45 КБ) 25 скачиваний
Убей их всех! Бог потом рассортирует...

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: [PHP] тормоза...

Непрочитанное сообщение zg » 2008-05-29 10:54:11

ок, пока смотрю, но самое быстрое решение будет на временных таблицах MySQL. Мускуль есть?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: [PHP] тормоза...

Непрочитанное сообщение zg » 2008-05-29 11:05:57

это скрипт, который подсвечивает нужные ссылки в тексте?

хмм... ща подумаю

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35420
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: [PHP] тормоза...

Непрочитанное сообщение Alex Keda » 2008-05-29 11:09:54

ну, это 1/5 функции которая это делает.
там несколько сложней - html убирается в массив, заменяется униальными строками, потом по нему проходиться эта функция, ещё пара подобных - правда там массивы на порядок или два меньше этого, взад вертается html, и отдаётся обратно.
это тот кусок который тупит больше всего....
именно приведённая строка...
===========
база разумеется. есть.
в файл текстовый я из базы переливал.
==========
а каким боком тут муся - мне в тексте вхождения надо заменитьь....
хотя даже несколько сотен простых запросов будут быстрей - это да....
Убей их всех! Бог потом рассортирует...

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: [PHP] тормоза...

Непрочитанное сообщение zg » 2008-05-29 11:37:39

без жертв не обойтись:

Код: Выделить всё

<?php

// время выполнения

setlocale(LC_ALL, 'ru_RU.CP1251');

	$model_marka_links_array = array();
	// открываем файл
	$handle = fopen("model_marka_links_array.txt", "r");
	while(!feof($handle)) {	// перебираем файл
		$str = fgets($handle);		// читаем строку из файла
		$str=trim($str);		// убираем начальные и конечные пробелы из файла
		if(empty($str)) continue;
		$model_marka_links_array[] = $str;	// добавление строки в массив
	}	// закрытие пребора файла
	// закрываем файл
	fclose($handle);


// достаём массивы из текстовых файлов
	$model_marka_array = array();
	// открываем файл
	$handle = fopen("model_marka_array.txt", "r");
	
	$i = 0;
	
	while(!feof($handle)) {	// перебираем файл
		$str = fgets($handle);		// читаем строку из файла
		$str=trim($str);		// убираем начальные и конечные пробелы из файла
		if(empty($str)) continue;
		$model_marka_array[$str] = $model_marka_links_array[ $i ++ ];	// добавление строки в массив
	}	// закрытие пребора файла
	// закрываем файл
	fclose($handle);



// достаём в переменную текст для обработки - text_for_replace.txt

		$handle = fopen("text_for_replace.txt", "rb");
		$text = fread($handle, filesize("text_for_replace.txt"));


// var_dump($model_marka_array);
// echo "===============================";
// var_dump($model_marka_links_array);

function repl( $str )
{
	global $model_marka_array;
	
	if ( isset($model_marka_array[ $str[0] ]) ) 
		return $model_marka_array[ $str[0] ];
	else 
		return $str[0];
}


// считываем текущее время
$start_time = microtime();
// разделяем секунды и миллисекунды
//(становятся значениями начальных ключей массива-списка)
$start_array = explode(" ",$start_time);
// это и есть стартовое время
$start_time = $start_array[1] + $start_array[0];

// заменяем. до момента замены время выполнения 0.0761
//$text = str_ireplace($model_marka_array, $model_marka_links_array, $text);

//$text = 'GAZ-А';
$text = preg_replace_callback('/[\w-]+/', 'repl', $text);

echo $text;
// после - время 4.7394

// Выводим время генерации скрипта
$end_time = microtime();
$end_array = explode(" ",$end_time);
$end_time = $end_array[1] + $end_array[0];
// вычитаем из конечного времени начальное
$time = $end_time - $start_time;
// округляем общее время
$time = round($time, 4);

echo "Время работы скрипта = ". $time;

?>
на перле этот скрипт будет работать в несколько раз быстрее, но есть траблы - составные слова не заменяются, поскольку регулярка слишком простая.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: [PHP] тормоза...

Непрочитанное сообщение zg » 2008-05-29 11:41:17

такие траблы легко и просто решаются посредством C и сортированных массивов, но это будет сложнее в плане реализации.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35420
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: [PHP] тормоза...

Непрочитанное сообщение Alex Keda » 2008-05-29 11:50:59

ясно...
на php решения нет...
тогда буду кэшировать выходной текст...
там есть кэширвоание - но страниц целиком - при появлении в массиве $_POST чего-то лишнего кэш удаляется...
в принципе - при копеечной посещаемости уже неплохо пашет - половина идёт из кэша.
придётся переписать кэширование на более сложное
Убей их всех! Бог потом рассортирует...

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: [PHP] тормоза...

Непрочитанное сообщение zg » 2008-05-29 11:55:00

lissyara писал(а):ясно...
на php решения нет...
да погоди сдаваться ))) выложи лучше мускульный экспорт таблиц ща ещё чё-нить нарую

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35420
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: [PHP] тормоза...

Непрочитанное сообщение Alex Keda » 2008-05-29 12:04:00

таблицы я могу любые сделать.
движок-то самописный.
==========
дамп таблицы по которой строиться текстовый файл.
принцип построениея простой

Код: Выделить всё

марка модель
маркамодель
марка-модель
типа того, с учётом что возможно смешивание русских и аглицких.
могу дать кусок кода на php для построения
Вложения
dump.sql.gz
(67.05 КБ) 20 скачиваний
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35420
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: [PHP] тормоза...

Непрочитанное сообщение Alex Keda » 2008-05-29 12:05:24

думаю, код не помешает сразу же...
проще будет

Код: Выделить всё

// построение массивов марок-моделей и соответствующих им url
// цель - обработка выводимого текст с целью более густой 
// внутренней перелинковки сайта
// начато 2007-12-01
// строим запрос на извлечение комбинаций марок и моделей
$sql = main_sql_query("SELECT /*
			CONVERT(`marka_name_eng` USING utf8) AS `marka_name_eng`,
			CONVERT(`marka_name_ru` USING utf8) AS `marka_name_ru`,
			CONVERT(`model_name_eng` USING utf8) AS `model_name_eng`,
			CONVERT(`model_name_ru` USING utf8) AS `model_name_ru` */
			*
			FROM `internal_links_level_1`");
// делаем массивы
$model_marka_array = array();
$model_marka_links_array = array();
// перебираем полученные данные, и стром массив
while ($row_id = mysql_fetch_assoc($sql))
{	// открытие построения массива
	//echo "имя переменной=" . $row_id['variable_name'] . "; значение переменной=" . $row_id['variable_value'] . "<br>";
	// строим url
	$url = "/catalog/" . $row_id['marka'] . "/" . $row_id['model'] . "/";
	// конвертим элементы
	$marka_name_eng = $row_id['marka_name_eng'];	//iconv('windows-1251','UTF-8',$row_id['marka_name_eng']);
	$model_name_eng = $row_id['model_name_eng'];	//iconv('windows-1251','UTF-8',$row_id['model_name_eng']);
	$marka_name_ru = $row_id['marka_name_ru'];	//iconv('windows-1251','UTF-8',$row_id['marka_name_ru']);
	$model_name_ru = $row_id['model_name_ru'];	//iconv('windows-1251','UTF-8',$row_id['model_name_ru']);

	$tip_content = "onMouseover=\"ddrivetip(" . $row_id['model_name_2'] . ")\" onMouseout=\"hideddrivetip()\" class=\"internal_invizible\"";

	// добавляем в массив аглицкую комбинацию
	array_push($model_marka_array, trim($marka_name_eng . " " . $model_name_eng));
	array_push($model_marka_links_array, "<a " . $tip_content . " href=\"$url\">" . $marka_name_eng . " " . $model_name_eng . "</a>");
	// добавляем в массив русскую комбинацию
	array_push($model_marka_array, trim($marka_name_ru . " " . $row_id['model_name_ru']));
	array_push($model_marka_links_array, "<a " . $tip_content . " href=\"$url\">" . $marka_name_ru . " " . $model_name_ru . "</a>");
	if($model_name_ru !== $model_name_eng){	// имена разные
		// добавляем в массив англо-русскую комбинацию
		array_push($model_marka_array, trim($marka_name_eng . " " . $model_name_ru));
		array_push($model_marka_links_array, "<a " . $tip_content . " href=\"$url\">" . $marka_name_eng . " " . $model_name_ru . "</a>");
		// добавляем в массив русско-ангийскую комбинацию
		array_push($model_marka_array, trim($marka_name_ru . " " . $model_name_eng));
		array_push($model_marka_links_array, "<a " . $tip_content . " href=\"$url\">" . $marka_name_ru . " " . $model_name_eng . "</a>");
	}	// закрытие - имена разные

	// надо ещё скленные - если без пробелов, типа Мазда3
	array_push($model_marka_array, trim($marka_name_eng . $model_name_eng));
	array_push($model_marka_links_array, "<a " . $tip_content . " href=\"$url\">" . $marka_name_eng . $model_name_eng . "</a>");
	// добавляем в массив русскую комбинацию
	array_push($model_marka_array, trim($marka_name_ru . $model_name_ru));
	array_push($model_marka_links_array, "<a " . $tip_content . " href=\"$url\">" . $marka_name_ru . $model_name_ru . "</a>");
	if($model_name_ru !== $model_name_eng){	// имена разные
		// добавляем в массив англо-русскую комбинацию
		array_push($model_marka_array, trim($marka_name_eng . $model_name_ru));
		array_push($model_marka_links_array, "<a " . $tip_content . " href=\"$url\">" . $marka_name_eng . $model_name_ru . "</a>");
		// добавляем в массив русско-ангийскую комбинацию
		array_push($model_marka_array,  trim($marka_name_ru . $model_name_eng));
		array_push($model_marka_links_array, "<a " . $tip_content . " href=\"$url\">" . $marka_name_ru . $model_name_eng . "</a>");
	}	// закрытие - имена разные

	// добавялем в массив вариант - через дефис. Глвное чтобы как диапазон не поняло...
	array_push($model_marka_array, trim($marka_name_eng . "-" . $model_name_eng));
	array_push($model_marka_links_array, "<a " . $tip_content . " href=\"$url\">" . $marka_name_eng . "-" . $model_name_eng . "</a>");
	// добавляем в массив русскую комбинацию
	array_push($model_marka_array, trim($marka_name_ru . "-" . $model_name_ru));
	array_push($model_marka_links_array, "<a " . $tip_content . " href=\"$url\">" . $marka_name_ru . "-" . $model_name_ru . "</a>");
	if($model_name_ru !== $model_name_eng){	// имена разные
		// добавляем в массив англо-русскую комбинацию
		array_push($model_marka_array, trim($marka_name_eng . "-" . $model_name_ru));
		array_push($model_marka_links_array, "<a " . $tip_content . " href=\"$url\">" . $marka_name_eng . "-" . $model_name_ru . "</a>");
		// добавляем в массив русско-ангийскую комбинацию
		array_push($model_marka_array, trim($marka_name_ru . "-" . $model_name_eng));
		array_push($model_marka_links_array, "<a " . $tip_content . " href=\"$url\">" . $marka_name_ru . "-" . $model_name_eng . "</a>");
	}	// закрытие - имена разные


}	// закрытие построения массива
Убей их всех! Бог потом рассортирует...

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: [PHP] тормоза...

Непрочитанное сообщение zg » 2008-05-29 12:36:21

всё!.. нашёл я как твою траблу побороть с помощью муси в три запроса :D ща ещё потестю и выложу

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: [PHP] тормоза...

Непрочитанное сообщение zg » 2008-05-29 13:11:27

Код: Выделить всё

SET @s:='Citroen C4 Picasso';
SELECT @s:=replace(@s,  marka_name_eng,  model_name_2) FROM internal_links_level_1;
SELECT @s;
суть, я думаю, ясна? :) пихаем переменную с нужным текстом в базу, потом прогоняем её через все записи в таблице, заменяя найденные слова, в данном случае marka_name_eng на model_name_2
Показывает записи 0 - 0 (1 всего, Запрос занял 0.0002 сек)
ну.. тут у меня запрос видать скешировался и показывает аж десятитысячные :D

решение?

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35420
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: [PHP] тормоза...

Непрочитанное сообщение Alex Keda » 2008-05-29 13:19:44

э....
все слова в тексте пихать в базу во всех комбинациях?
в описании ситроена 4 могут быть упоминания о пежо, контора -то одна...
или отзыв посетителя где он пеерчислит десяток машинк оторыми владел...
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35420
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: [PHP] тормоза...

Непрочитанное сообщение Alex Keda » 2008-05-29 13:24:59

интеерсно, а сколько переменных муся выдержит...
если я всю колонку таблицы запихаю как переменные... и по тексту искать и заменять
вопрос что быстрей будет - муся или str_replace....
т.е. переверну твой метод - выдержит или нет...
надо вечером попробовать....
Убей их всех! Бог потом рассортирует...

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: [PHP] тормоза...

Непрочитанное сообщение zg » 2008-05-29 13:31:21

lissyara писал(а):э....
все слова в тексте пихать в базу во всех комбинациях?
тут есть много вариантов, я бы сделал таблицу синонимов
lissyara писал(а):в описании ситроена 4 могут быть упоминания о пежо, контора -то одна...
или отзыв посетителя где он пеерчислит десяток машинк оторыми владел...
эээ... я дал идею как заменить "узкое" место ;)

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: [PHP] тормоза...

Непрочитанное сообщение zg » 2008-05-29 13:33:44

lissyara писал(а):интеерсно, а сколько переменных муся выдержит...
если я всю колонку таблицы запихаю как переменные... и по тексту искать и заменять
а как ты хочешь сделать? у меня моск этого не понимает... да и смысл, селект работает быстрее