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'])]);
}


Тест


Печаль. icon_smile.gif

Последний раз редактировалось: Yacc (22/12/13 в 14:32), всего редактировалось 1 раз
цитата
22/12/13 в 11:59
 AWD
ого, это in_array такой медленный? не ожидал. хотя хуле, если нет совпадений то просматривается весь список... посыпаю голову водкой smail101.gif да и parse_url раза в полтора шустрее работает, чем регулярка. то вчера по синьке захотелось регулярками повыёбываться (да и то криво) smail101.gif но вот домены сделать ключами - отличное решение, браво! пьянству - бой. icon_surprised.gif а я говорил тогда математичке, "трезвым меня на олимпиаду слать нужно было"... а так только второе место smail101.gif
Yacc: кросавчег! сразу видно, с клавиатурой родился icon_biggrin.gif а я 8 лет на фортепиано учился, и пост писал после 0.7, почувствуйте разницу icon_mrgreen.gif
ЗЫ: о сломанном мозге:
нужна функция, которая принимает 1 - возвращает 2. и наоборот: принимает 2, возвращает 1...
мы простых путей не ищем - return 3-$x; не катит. вот как надо: return $x%2+1; ....
цитата
22/12/13 в 12:24
 Elite Profit
AWD: не парься, вы оба молодцы icon_smile.gif 99% что топикстартеру в принципе такие скорости не нужны icon_smile.gif
цитата
22/12/13 в 12:33
 AWD
Elite Profit: да я сильно и не парюсь, но будучи немножко перфекционистом, отдаю предпочтение и уважение решению Yacc:. я знаю много быстрых штук, например, при проверке значений одного типа == работает в 1,5-2 раза медленнее, чем ===, ибо не происходит приведение типов,...
а в целом, как для 0,7 - еще и рабочую регулярку написать... smail101.gif
цитата
22/12/13 в 14:14
 Stek
Yacc писал:
Тест

И как так получается, что при 100 и 100000 записях, yacc тратит одинаковое колличество времени ? smail101.gif
цитата
22/12/13 в 14:42
 AWD
Stek писал:
И как так получается, что при 100 и 100000 записях, yacc тратит одинаковое колличество времени ? smail101.gif
кстати, да, 1К отработал медленнее, чем 100К smail101.gif лень проверять, но все же яцц круче авд. факт icon_cool.gif

и, наверное, у яцц сходу скрипт получает совпадение - не зависимо от стотыщмильёнов записей. ждем яцика. smail54.gif smail101.gif

Последний раз редактировалось: AWD (22/12/13 в 15:08), всего редактировалось 1 раз
цитата
22/12/13 в 15:03
 Elite Profit
AWD писал:
кстати, да, 1К отработал медленнее, чем 100К smail101.gif лень проверять, но все же яцц круче авд. факт icon_cool.gif


по понятным причинам его код быстрей будет, но графики, видимо, не так немного отрисованы, тоже факт. затраты времени на поиск по ключу среди 1000 и 10000 все же будут не в пользу последнего.
цитата
22/12/13 в 16:56
 Yacc
Stek писал:
И как так получается, что при 100 и 100000 записях, yacc тратит одинаковое колличество времени ?

Мне больше интересно как человек столько накодивший не знает, что поиск по ключу в хэш-таблице имеет сложность О(1)? icon_smile.gif



Elite Profit писал:
графики, видимо, не так немного отрисованы, тоже факт

Все так, поверь. icon_smile.gif

Поиск посредством in_array имеет сложность О(n), где n индекс искомого элемента. Т.е. если этот элемент последний, то мы получим картинку из предыдущего поста. А если первый, то вот такую:



Что тоже как бы намекает. icon_smile.gif
цитата
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 trollface.png
цитата
22/12/13 в 19:53
 Mad
Ого, ребята, ничего себе, спасибо что откликнулись! smail54.gif

Только вопрос, как код что дал 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: замечательно, только как это всё будет выглядеть итого? с выводом моего дива? icon_rolleyes.gif
цитата
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
}

icon_smile.gif
цитата
22/12/13 в 20:19
 Mad
Yacc, ага понял, просто я это писал тогда, когда там дива ещё не было icon_smile.gif

Спасибо Всем!
цитата
23/12/13 в 08:16
 AWD
Yacc писал:
Мне больше интересно как человек столько накодивший не знает, что поиск по ключу в хэш-таблице имеет сложность О(1)? icon_smile.gif
не помню, писал или нет.. я самоучка. 8 лет учился на фортепиано. чувствуешь разницу? и образование у меня 8 классов. еще 2 года бурсы и год вечерки. понимаешь? и я же не отрицаю, а понимаю и принимаю. да и 0,7 - это не шутка. поэтому, когда я вижу быстрый код - это не одно и тоже, что ты мне тут гнешь функции, которые я в жизни не видел. а вообще я с 18 лет в туалет ходил с книгой Си, а до 18 - с гитарой... такое... вообщем, сделай скидку... я вроде объяснил, почему не знаю О(1) - вообще не понимаю, о чем ты, понимаешь? smail101.gif
цитата
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 писал: ты, похоже, не читал, что я писал.... давай так: я тебя уважаю. я твое решение считаю зачетным. перстань. просто перестань.
цитата
24/12/13 в 03:38
 idk2045
устроили хренотень какую-то лол smail101.gif
представляю как бы в таком стиле обсуждалась сортировка пузырьком или не дай бог quicksort smail101.gif
count($domains) == 100000 - это называется перебдеть, мягко говоря. ну или я хотел бы посмотреть на php файл, со 100к доменами.
цитата
24/12/13 в 07:51
 Yacc
Еще один. По сути есть что сказать? Или тоже попердеть пришел? icon_smile.gif
цитата
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 - собутыльники. icon_smile.gif

Правильный тест.
<?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  >  последняя »


Эта страница в полной версии