С нами с 11.12.11
Сообщения: 351
Рейтинг: 737
|
Добавлено: 22/12/13 в 04:56 |
Привет!
Подскажите плиз на php решение, есть список рефереров (domain1.com, domain2.com, domain3.com), если реферер из этого списка (в реферере есть этот домен с www или без) то выводим <div class="hello">Hello</div>, если реферер не из этого списка или пустой вообще, то не выводим ничего.
Благодарю заранее!
|
|
|
|
С нами с 03.02.11
Сообщения: 842
Рейтинг: 301
|
Добавлено: 22/12/13 в 06:52 |
Код: |
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 'тут твой див';
}
|
сорри, если не очень лаконично... сильно пьян... как всегда...
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 22/12/13 в 11:16 |
Код: | 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 раз
|
|
|
|
С нами с 03.02.11
Сообщения: 842
Рейтинг: 301
|
Добавлено: 22/12/13 в 11:59 |
ого, это in_array такой медленный? не ожидал. хотя хуле, если нет совпадений то просматривается весь список... посыпаю голову водкой да и parse_url раза в полтора шустрее работает, чем регулярка. то вчера по синьке захотелось регулярками повыёбываться (да и то криво) но вот домены сделать ключами - отличное решение, браво! пьянству - бой. а я говорил тогда математичке, "трезвым меня на олимпиаду слать нужно было"... а так только второе место
Yacc: кросавчег! сразу видно, с клавиатурой родился а я 8 лет на фортепиано учился, и пост писал после 0.7, почувствуйте разницу
ЗЫ: о сломанном мозге:
нужна функция, которая принимает 1 - возвращает 2. и наоборот: принимает 2, возвращает 1...
мы простых путей не ищем - return 3-$x; не катит. вот как надо: return $x%2+1; ....
|
|
|
|
С нами с 07.04.07
Сообщения: 161
Рейтинг: 203
|
Добавлено: 22/12/13 в 12:24 |
AWD: не парься, вы оба молодцы 99% что топикстартеру в принципе такие скорости не нужны
|
|
|
|
С нами с 03.02.11
Сообщения: 842
Рейтинг: 301
|
Добавлено: 22/12/13 в 12:33 |
Elite Profit: да я сильно и не парюсь, но будучи немножко перфекционистом, отдаю предпочтение и уважение решению Yacc:. я знаю много быстрых штук, например, при проверке значений одного типа == работает в 1,5-2 раза медленнее, чем ===, ибо не происходит приведение типов,...
а в целом, как для 0,7 - еще и рабочую регулярку написать...
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 22/12/13 в 14:14 |
И как так получается, что при 100 и 100000 записях, yacc тратит одинаковое колличество времени ?
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
6
|
|
|
С нами с 03.02.11
Сообщения: 842
Рейтинг: 301
|
Добавлено: 22/12/13 в 14:42 |
|
|
|
|
С нами с 07.04.07
Сообщения: 161
Рейтинг: 203
|
Добавлено: 22/12/13 в 15:03 |
AWD писал: | кстати, да, 1К отработал медленнее, чем 100К лень проверять, но все же яцц круче авд. факт |
по понятным причинам его код быстрей будет, но графики, видимо, не так немного отрисованы, тоже факт. затраты времени на поиск по ключу среди 1000 и 10000 все же будут не в пользу последнего.
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 22/12/13 в 16:56 |
Stek писал: | И как так получается, что при 100 и 100000 записях, yacc тратит одинаковое колличество времени ? |
Мне больше интересно как человек столько накодивший не знает, что поиск по ключу в хэш-таблице имеет сложность О(1)?
Elite Profit писал: | графики, видимо, не так немного отрисованы, тоже факт |
Все так, поверь.
Поиск посредством in_array имеет сложность О(n), где n индекс искомого элемента. Т.е. если этот элемент последний, то мы получим картинку из предыдущего поста. А если первый, то вот такую:
Что тоже как бы намекает.
|
|
|
|
С нами с 18.10.02
Сообщения: 4165
Рейтинг: 3365
|
Добавлено: 22/12/13 в 17:03 |
Yacc: Респект. Радует, что остались еще люди, понимающие, что такое алгоритмы и структуры данных, и использующие их по назначению.
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 22/12/13 в 17:21 |
Оффтопик: а на чем можно проверять скрипты?
вот чтоб так сравнивалось с гравиками?
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 22/12/13 в 17:46 |
Lexikon писал: | Оффтопик: а на чем можно проверять скрипты?
вот чтоб так сравнивалось с гравиками? |
Оффтопик: JS отлично проверять тут, сразу под браузеры, тоже очень полезно при написании приложений http://jsperf.com/browse
|
|
|
|
С нами с 11.12.11
Сообщения: 351
Рейтинг: 737
|
Добавлено: 22/12/13 в 19:53 |
Ого, ребята, ничего себе, спасибо что откликнулись!
Только вопрос, как код что дал 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 'тут твой див';
}
|
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 22/12/13 в 20:06 |
Код: | $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
} |
|
|
|
|
С нами с 11.12.11
Сообщения: 351
Рейтинг: 737
|
Добавлено: 22/12/13 в 20:11 |
Yacc: замечательно, только как это всё будет выглядеть итого? с выводом моего дива?
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 22/12/13 в 20:15 |
Код: | $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
} |
|
|
|
|
С нами с 11.12.11
Сообщения: 351
Рейтинг: 737
|
Добавлено: 22/12/13 в 20:19 |
Yacc, ага понял, просто я это писал тогда, когда там дива ещё не было
Спасибо Всем!
|
|
|
|
С нами с 03.02.11
Сообщения: 842
Рейтинг: 301
|
Добавлено: 23/12/13 в 08:16 |
не помню, писал или нет.. я самоучка. 8 лет учился на фортепиано. чувствуешь разницу? и образование у меня 8 классов. еще 2 года бурсы и год вечерки. понимаешь? и я же не отрицаю, а понимаю и принимаю. да и 0,7 - это не шутка. поэтому, когда я вижу быстрый код - это не одно и тоже, что ты мне тут гнешь функции, которые я в жизни не видел. а вообще я с 18 лет в туалет ходил с книгой Си, а до 18 - с гитарой... такое... вообщем, сделай скидку... я вроде объяснил, почему не знаю О(1) - вообще не понимаю, о чем ты, понимаешь?
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 23/12/13 в 22:36 |
|
|
|
|
С нами с 03.02.11
Сообщения: 842
Рейтинг: 301
|
Добавлено: 23/12/13 в 23:16 |
ты, похоже, не читал, что я писал.... давай так: я тебя уважаю. я твое решение считаю зачетным. перстань. просто перестань.
|
|
|
|
С нами с 27.09.03
Сообщения: 5454
Рейтинг: 2506
|
Добавлено: 24/12/13 в 03:38 |
устроили хренотень какую-то лол
представляю как бы в таком стиле обсуждалась сортировка пузырьком или не дай бог quicksort
count($domains) == 100000 - это называется перебдеть, мягко говоря. ну или я хотел бы посмотреть на php файл, со 100к доменами.
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 24/12/13 в 07:51 |
Еще один. По сути есть что сказать? Или тоже попердеть пришел?
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 24/12/13 в 14:19 |
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];
}
|
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
2
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 24/12/13 в 15:13 |
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> |
|
|
|
|