Master-X
Регистрация
|
Вход
Форум
|
Новости
|
Статьи
Главная
»
Форум
»
Программинг, Скрипты, Софт, Сервисы
»
Тема:
Подскажите штуку на php плиз
Новая тема
Ответить
цитата
22/12/13 в 04:56
Mad
Привет!
Подскажите плиз на php решение, есть список рефереров (domain1.com, domain2.com, domain3.com), если реферер из этого списка (в реферере есть этот домен с www или без) то выводим <div class="hello">Hello</div>, если реферер не из этого списка или пустой вообще, то не выводим ничего.
Благодарю заранее!
цитата
22/12/13 в 06:52
AWD
Код:
if(isset($_SERVER['HTTP_REFERER'])) {
$list = array('domain1.com', 'domain2.com', 'domain3.com', 'localhost');
$ref = preg_replace('~(?:http://)?(?:www\.)?([^/]+).*~', '$1', $_SERVER['HTTP_REFERER']);
if(in_array($ref, $list))
echo 'тут твой див';
}
сорри, если не очень лаконично... сильно пьян... как всегда...
цитата
22/12/13 в 11:16
Yacc
Код:
function awd() {
$domains = array(
'domain1.com',
'domain2.com',
'domain3.com'
);
if (isset($_SERVER['HTTP_REFERER'])) {
$ref = preg_replace('~(?:http://)?(?:www\.)?([^/]+).*~', '$1', $_SERVER['HTTP_REFERER']);
return in_array($ref, $domains);
}
}
function yacc() {
$domains = array(
'domain1.com' => true,
'domain2.com' => true,
'domain3.com' => true
);
return isset($_SERVER['HTTP_REFERER']) and ($ref = parse_url($_SERVER['HTTP_REFERER'])) and isset($domains[str_replace('www.', '', $ref['host'])]);
}
Тест
Печаль.
Последний раз редактировалось: Yacc (
22/12/13 в 14:32
), всего редактировалось 1 раз
цитата
22/12/13 в 11:59
AWD
ого, это in_array такой медленный? не ожидал. хотя хуле, если нет совпадений то просматривается весь список... посыпаю голову водкой
да и parse_url раза в полтора шустрее работает, чем регулярка. то вчера по синьке захотелось регулярками повыёбываться (да и то криво)
но вот домены сделать ключами - отличное решение, браво! пьянству - бой.
а я говорил тогда математичке, "трезвым меня на олимпиаду слать нужно было"... а так только второе место
Yacc:
кросавчег! сразу видно, с клавиатурой родился
а я 8 лет на фортепиано учился, и пост писал после 0.7, почувствуйте разницу
ЗЫ: о сломанном мозге:
нужна функция, которая принимает 1 - возвращает 2. и наоборот: принимает 2, возвращает 1...
мы простых путей не ищем - return 3-$x; не катит. вот как надо: return $x%2+1; ....
цитата
22/12/13 в 12:24
Elite Profit
AWD:
не парься, вы оба молодцы
99% что топикстартеру в принципе такие скорости не нужны
цитата
22/12/13 в 12:33
AWD
Elite Profit:
да я сильно и не парюсь, но будучи немножко перфекционистом, отдаю предпочтение и уважение решению
Yacc:
. я знаю много быстрых штук, например, при проверке значений одного типа == работает в 1,5-2 раза медленнее, чем ===, ибо не происходит приведение типов,...
а в целом, как для 0,7 - еще и рабочую регулярку написать...
цитата
22/12/13 в 14:14
Stek
Yacc писал:
Тест
И как так получается, что при 100 и 100000 записях, yacc тратит одинаковое колличество времени ?
цитата
22/12/13 в 14:42
AWD
Stek писал:
И как так получается, что при 100 и 100000 записях, yacc тратит одинаковое колличество времени ?
кстати, да, 1К отработал медленнее, чем 100К
лень проверять, но все же яцц круче авд. факт
и, наверное, у яцц сходу скрипт получает совпадение - не зависимо от стотыщмильёнов записей. ждем яцика.
Последний раз редактировалось: AWD (
22/12/13 в 15:08
), всего редактировалось 1 раз
цитата
22/12/13 в 15:03
Elite Profit
AWD писал:
кстати, да, 1К отработал медленнее, чем 100К
лень проверять, но все же яцц круче авд. факт
по понятным причинам его код быстрей будет, но графики, видимо, не так немного отрисованы, тоже факт. затраты времени на поиск по ключу среди 1000 и 10000 все же будут не в пользу последнего.
цитата
22/12/13 в 16:56
Yacc
Stek писал:
И как так получается, что при 100 и 100000 записях, yacc тратит одинаковое колличество времени ?
Мне больше интересно как человек столько накодивший не знает, что
поиск по ключу в хэш-таблице имеет сложность О(1)
?
Elite Profit писал:
графики, видимо, не так немного отрисованы, тоже факт
Все так, поверь.
Поиск посредством in_array имеет сложность О(n), где n индекс искомого элемента. Т.е. если этот элемент последний, то мы получим картинку из предыдущего поста. А если первый, то вот такую:
Что тоже как бы намекает.
цитата
22/12/13 в 17:03
Mika
Yacc:
Респект. Радует, что остались еще люди, понимающие, что такое алгоритмы и структуры данных, и использующие их по назначению.
цитата
22/12/13 в 17:21
Lexikon
Оффтопик:
а на чем можно проверять скрипты?
вот чтоб так сравнивалось с гравиками?
цитата
22/12/13 в 17:46
ibiz
Lexikon писал:
Оффтопик:
а на чем можно проверять скрипты?
вот чтоб так сравнивалось с гравиками?
Оффтопик:
JS отлично проверять тут, сразу под браузеры, тоже очень полезно при написании приложений
http://jsperf.com/browse
цитата
22/12/13 в 19:53
Mad
Ого, ребята, ничего себе, спасибо что откликнулись!
Только вопрос, как код что дал
AWD
, привести к виду с учетом замечаний
Yacc
? Ведь он, как вы говорите, быстрее.
Код:
if(isset($_SERVER['HTTP_REFERER'])) {
$list = array('domain1.com', 'domain2.com', 'domain3.com', 'localhost');
$ref = preg_replace('~(?:http://)?(?:www\.)?([^/]+).*~', '$1', $_SERVER['HTTP_REFERER']);
if(in_array($ref, $list))
echo 'тут твой див';
}
цитата
22/12/13 в 20:06
Yacc
Код:
$domains = array(
'domain1.com' => true,
'domain2.com' => true,
'domain3.com' => true
);
if (isset($_SERVER['HTTP_REFERER']) and ($ref = parse_url($_SERVER['HTTP_REFERER'])) and isset($domains[str_replace('www.', '', $ref['host'])])) {
?><div class="hello">Hello</div><?php
}
цитата
22/12/13 в 20:11
Mad
Yacc:
замечательно, только как это всё будет выглядеть итого? с выводом моего дива?
цитата
22/12/13 в 20:15
Yacc
Код:
$domains = array(
'domain1.com' => true,
'domain2.com' => true,
'domain3.com' => true
);
if (isset($_SERVER['HTTP_REFERER']) and ($ref = parse_url($_SERVER['HTTP_REFERER'])) and isset($domains[str_replace('www.', '', $ref['host'])])) {
?>
<div class="hello">Hello</div>
<?php
}
цитата
22/12/13 в 20:19
Mad
Yacc
, ага понял, просто я это писал тогда, когда там дива ещё не было
Спасибо Всем!
цитата
23/12/13 в 08:16
AWD
Yacc писал:
Мне больше интересно как человек столько накодивший не знает, что
поиск по ключу в хэш-таблице имеет сложность О(1)
?
не помню, писал или нет.. я самоучка. 8 лет учился на фортепиано. чувствуешь разницу? и образование у меня 8 классов. еще 2 года бурсы и год вечерки. понимаешь? и я же не отрицаю, а понимаю и принимаю. да и 0,7 - это не шутка. поэтому, когда я вижу быстрый код - это не одно и тоже, что ты мне тут гнешь функции, которые я в жизни не видел. а вообще я с 18 лет в туалет ходил с книгой Си, а до 18 - с гитарой... такое... вообщем, сделай скидку... я вроде объяснил, почему не знаю О(1) - вообще не понимаю, о чем ты, понимаешь?
цитата
23/12/13 в 22:36
Yacc
AWD писал:
не знаю О(1) - вообще не понимаю
Формально:
http://ru.wikipedia.org/wiki/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D 1%82%D1%8C
Неформально, но в контексте топика:
http://stackoverflow.com/questions/2473989/list-of-big-o-for-php-functions
цитата
23/12/13 в 23:16
AWD
Yacc писал:
Формально:
http://ru.wikipedia.org/wiki/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D 1%82%D1%8C
Неформально, но в контексте топика:
http://stackoverflow.com/questions/2473989/list-of-big-o-for-php-functions
ты, похоже, не читал, что я писал.... давай так: я тебя уважаю. я твое решение считаю зачетным. перстань. просто перестань.
цитата
24/12/13 в 03:38
idk2045
устроили хренотень какую-то лол
представляю как бы в таком стиле обсуждалась сортировка пузырьком или не дай бог quicksort
count($domains) == 100000 - это называется перебдеть, мягко говоря. ну или я хотел бы посмотреть на php файл, со 100к доменами.
цитата
24/12/13 в 07:51
Yacc
Еще один. По сути есть что сказать? Или тоже попердеть пришел?
цитата
24/12/13 в 14:19
Stek
Yacc писал:
Мне больше интересно как человек столько накодивший не знает, что поиск по ключу в хэш-таблице имеет сложность О(1)?
Я сейчас специально сделал тестовый скрипт на 100000 запросов к функции.
yacc - 0.36 секунды
awd - 0.42 секунды.
Т.е. разницы фактически ни какой. Лень копать далее, но больше убежден, что разница из за использование preg vs parse_url. Но вот задавать массив доменов списком без ключей - куда удобнее. И к тому же preg оставляет возможность использовать маски.
<?php
$_SERVER['HTTP_REFERER'] = 'http://www.domain3.com/sapme.html';
$time_start = microtime(true);
for ($i = 0; $i < 100000; $i++ ) {
//awd();
yacc();
}
print "Time: ".( microtime(true) - $time_start )."<br />";
function awd() {
$domains = array(
'domain1.com',
'domain2.com',
'domain3.com'
);
if (isset($_SERVER['HTTP_REFERER'])) {
$ref = preg_replace('~(?:http://)?(?:www\.)?([^/]+).*~', '$1', $_SERVER['HTTP_REFERER']);
return in_array($ref, $domains);
}
}
function yacc() {
$domains = array(
'domain1.com' => true,
'domain2.com' => true,
'domain3.com' => true
);
return isset($_SERVER['HTTP_REFERER']) and ($ref = parse_url($_SERVER['HTTP_REFERER'])) and isset($domains[str_replace('www.', '', $ref['host'])]);
}
print "Final used memory: ".convert(memory_get_usage(true))."<br />";
function convert($size)
{
$unit=array('b','kb','mb','gb','tb','pb');
return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}
цитата
24/12/13 в 15:13
Yacc
Stek писал:
Я сейчас специально сделал тестовый скрипт
У меня складывается впечатление, что ты и AWD - собутыльники.
Правильный тест.
<?php
function awd($list) {
if (isset($_SERVER['HTTP_REFERER'])) {
$ref = preg_replace('~(?:http://)?(?:www\.)?([^/]+).*~', '$1', $_SERVER['HTTP_REFERER']);
return in_array($ref, $list);
}
}
function yacc($domains) {
return isset($_SERVER['HTTP_REFERER']) and ($ref = parse_url($_SERVER['HTTP_REFERER'])) and isset($domains[str_replace('www.', '', $ref['host'])]);
}
$data = array();
$needle = 'localhost';
$_SERVER['HTTP_REFERER'] = 'http://www.' . $needle . '/path/to/file.php';
for ($i = 1; $i < 110; $i += 10) {
$list = array();
$domains = array();
$size = 1000 * $i - ($i > 1 ? 1000 : 0);
// $needle index
$k = $size - 1;
for ($j = 0; $j < $size; $j += 1) {
$domain = (($j != $k) ? 'domain' . $j . '.com' : $needle);
$list[] = $domain;
$domains[$domain] = true;
}
$t = microtime(true);
awd($list);
$awd = (microtime(true) - $t) * 1000;
$t = microtime(true);
yacc($domains);
$yacc = (microtime(true) - $t) * 1000;
$data[] = "[" . implode(", ", array("'" . $size . "'", $awd, $yacc)) . "]";
}
?>
<div id="chart" style="width:60%;height:70%"></div>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("visualization", "1", {packages:["corechart"]});
google.setOnLoadCallback(drawChart);
function drawChart() {
var data = google.visualization.arrayToDataTable([
['Size', "awd", "yacc"],
<?php echo implode(",\n", $data); ?>
]);
var options = {
vAxis: {title: 'count($domains)'},
hAxis: {title: 'microtime(true)'}
};
var chart = new google.visualization.BarChart(document.getElementById('chart'));
chart.draw(data, options);
}
</script>
Стр.
1
,
2
>
последняя »
Новая тема
Ответить
Эта страница в полной версии