2010-06-24 8 views
3

Я пытаюсь предотвратить кэширование, добавив '? t = 'до конца моих файлов JS. Какой самый быстрый способ получить такой номер? time() или rand() или что-то еще?Самый быстрый способ получить случайный номер php?

+0

быстрый смысл хотя бы ресурсоемким. – Thwyrm

+0

@ Justin: как всегда :) – BoltClock

+8

Почему вы так обеспокоены скоростью этой конкретной операции? Вы профилировали? Сколько времени вы ожидаете сохранить, выбирая один за другим? ... позвольте мне быть более прямым: это не имеет значимой разницы. Мы говорим о разнице, измеренной в наносекундах. –

ответ

6

времени() и mt_rand() очень похожи с точки зрения эффективности в PHP-вы выбираете один или другой на основе каких факторов вам это нужно:

  • Просто трудно догадаться: использование mt_rand() (например, генерируя соль использования)
  • Получите уникальный идентификатор, который трудно угадать: используйте mt_rand (1, 931415926536); (Например, генерируя идентификатор сеанса)
  • (очевидно) вести учет: использовать время() (например, предотвратить кэширование, журналы и т.д.)

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

(mt_rand() примерно в 4 раза быстрее, чем рандов())

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

+0

Время() немного быстрее, чем? Rand или mtrand? – Thwyrm

+2

Время() немного быстрее, чем оба. Кроме того, для управления кешем существует небольшая вероятность, что вы будете генерировать одинаковое случайное число дважды; это не так (если ваша машина не очень быстро и у вас есть несколько запросов в секунду) для time(). –

+0

Спасибо :) 15char – Thwyrm

2

Try:

'?t=' . mt_rand(time()); 
+4

Почему не просто 'time()'? Выбор случайного числа между 1 и временем делает его медленнее ... Я не думаю, что он хотел совместить их, он просто хочет выбрать наименьший выбор. – animuson

+0

^^ что он сказал. – Thwyrm

+0

@animuson: Да, хорошая точка, обновленный 'mt_rand' лучший выбор в этом случае. – Sarfraz

-1
srand(time()); 
echo '?t=' . rand(); 
+1

Это не более случайное, чем time(), поскольку оно будет предоставлять одинаковое полу случайное число в течение 1 секунды в то время. –

+0

Хотя это верно, прецеденты используют только предотвращение кэширования ресурсов JS. В этом случае я считаю это разумным решением. – Nathan

5

Если вы только предотвращение кэширования, время() будет вполне достаточно.

+0

Является ли это более эффективным, чем rand или mt_rand? – Thwyrm

+1

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

+1

Я действительно не знаю, как работает функция времени, чтобы определить количество секунд, но я бы предположил, что это будет быстрее, чем запустить алгоритм случайных чисел, возможно, не так много. Тем не менее, он гарантирует, что вы никогда не получите результат повторения, который можно использовать с помощью функции случайных чисел. – animuson

2

Не используйте rand(), используйте mt_rand().

Он использует генератор случайных чисел с известными характеристиками с использованием Mersenne Twister, который будет производить случайные числа в четыре раза быстрее, чем то, что обеспечивает среднее Libc RAND().

+5

Это не глупо. Вы, – Thwyrm

+4

, могли бы вы, ребята, бросить запугивание? вопрос не является глупым, и не является этим ответом. растут –

3

Назовите меня старомодным, но предотвращение кеширования - это то, чего можно и нужно добиться, используя HTTP-заголовки, а не уникальные URL-адреса. Если вы служите файл динамически с помощью PHP:

<?php 
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past 
?> 

в противном случае использовать файл .htaccess в Apache (или аналогичный конфиг в любой другой веб-сервер):

<FilesMatch "\.js$"> 
Header set Cache-Control "no-cache, must-revalidate" 
Header set Expires "Sat, 26 Jul 1997 05:00:00 GMT" 
</FilesMatch> 
Смежные вопросы