Что использовать? функция time() или $_SERVER['REQUEST_TIME']? Что лучше?

Какая из этих двух функций времени лучше?

У меня есть форма на моем веб-сайте, которая отправляется тысячами пользователей каждую микросекунду или меньше, таким образом, тысячи запросов одновременно на моем сервере.

Поэтому я хочу использовать тот, который не использует сон во время выполнения. Кроме того, насколько уникальны $_SERVER['REQUEST_TIME'] и time()? Оба изменяются каждую микросекунду?

Будет ли $_SERVER['REQUEST_TIME'] меняться каждый раз, когда я отправляю форму? Например, функция time() будет меняться при каждой разнице во времени.

Мне нужно предоставить уникальный URL-адрес пользователю для проверки, в который я добавляю уникальный результат, полученный из любого из двух? Кроме того, использование microtime() заставит PHP спать? не так ли?


person sqlchild    schedule 24.08.2012    source источник
comment
Меня всегда удивляло, что люди, у которых тысячи запросов в секунду, всегда пытаются сэкономить на тривиальных функциях и вместо измерения/профилирования тратят время на догадки.   -  person zerkms    schedule 24.08.2012
comment
зачем вам тратить время на проверку? Не должен ли уникальный идентификатор для проверки быть максимально непредсказуемым? Время можно (в определенных пределах, но все же) предсказать! Не лучше ли просто использовать случайное значение? (возможно, со временем в качестве семени для генератора случайных чисел, но это побочный момент)   -  person codeling    schedule 24.08.2012
comment
И time(), и $_SERVER['REQUEST_TIME'] — это количество секунд с 01.01.1970. microtime() использует микросекунды.   -  person lisandro    schedule 16.04.2020


Ответы (6)


Это зависит.

$_SERVER['REQUEST_TIME'] соответствует времени начала запроса, веб-сервер предоставляет эти данные.

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

Вы должны быть более конкретными в том, что вы хотите сделать, чтобы мы могли дать вам полные ответы.

person Intrepidd    schedule 24.08.2012
comment
Тогда нельзя полагаться на время. Возможно, сгенерируйте случайный токен и посолите его с помощью tim и ip запросов, это должно помочь. - person Intrepidd; 24.08.2012
comment
$_SERVER[R_T] меняется каждый раз при отправке формы? - person sqlchild; 24.08.2012
comment
Уникальность не гарантируется, если веб-сервер является многопоточным и получает два соединения одновременно, значения, скорее всего, будут идентичными. - person Intrepidd; 24.08.2012

time() изменяется один раз в секунду. microtime() (опционально с (true)) чаще.

$_SERVER['REQUEST_TIME'] устанавливается при запуске процесса PHP, но это всего лишь простой поиск переменной, и так быстрее. В большинстве случаев вам не нужно микросекундное разрешение, особенно если процесс в любом случае будет выполняться только доли секунды для создания веб-страницы.

person Alister Bulman    schedule 24.08.2012
comment
Мне нужно предоставить уникальный URL-адрес пользователю для проверки, в который я добавляю уникальный результат, полученный из любого из двух? Кроме того, сэр, microtime() заставит PHP спать? не так ли? - person sqlchild; 24.08.2012
comment
Микротайм не спит. Если вам нужно уникальное значение, используйте что-то, предназначенное для этого, например php.net/manual. /en/function.uniqid.php или любой другой генератор UUID. - person Alister Bulman; 24.08.2012
comment
но он использует gettimeofday(), который заставляет PHP спать, я думаю? - person sqlchild; 24.08.2012
comment
gettimeofday() требует времени и некоторых усилий, но не ждет намеренно. - person Alister Bulman; 24.08.2012

с php.net:

$_SERVER['REQUEST_TIME_FLOAT'];
Отметка времени начала запроса с точностью до микросекунды.

http://php.net/manual/en/reserved.variables.server.php (Осторожно, см. примечание Алистера об использовании REQUEST_TIME)

person DayloStar    schedule 18.04.2013

$_SERVER['REQUEST_TIME'] соответствует времени начала сеанса, это полностью отличается от использования time() или microtime() тем, что оно является постоянным для этого запуска.

person deed02392    schedule 24.08.2012

вы должны учитывать миллисекунды на основе microtime()

$milliseconds = round(microtime(true) * 1000);
person Mihai Iorga    schedule 24.08.2012

Вы должны использовать time() или microtime(), или uniqid(), если это должно быть уникальным для целей проверки.

Вопрос в том, зачем вам нужно время, чтобы быть уникальным?

EDIT: потому что вы отредактировали свой вопрос.

$_SERVER['REQUEST_TIME'] даст вам метку времени начала запроса. Он будет меняться в зависимости от времени, когда пользователь делает запрос.

person Wayne Whitty    schedule 24.08.2012
comment
Мне нужно предоставить уникальный URL-адрес пользователю для проверки, в который я добавляю уникальный результат, полученный из любого из двух? Кроме того, сэр, microtime() заставит PHP спать? не так ли? - person sqlchild; 24.08.2012
comment
Если вы ищете уникальную строку для целей проверки, вам, вероятно, следует заглянуть в функцию uniquid(). Он получает уникальный идентификатор с префиксом, основанный на текущем времени в микросекундах. - person Wayne Whitty; 24.08.2012
comment
uniqid() использует gettimeofday(), который заставляет PHP спать? поэтому я избегаю этого, сэр. :) - person sqlchild; 24.08.2012
comment
$_SERVER[R_T] меняется каждый раз при отправке формы? - person sqlchild; 24.08.2012
comment
Достаточно ли вы профилировали, чтобы точно знать, что у sleep() есть заметные проблемы с производительностью? - person Wayne Whitty; 24.08.2012
comment
да, сэр, я сам читал об этом в Интернете ... тоже получил статью о его сне, поэтому избегал его и наблюдал за собой в своем приложении, на моем веб-сайте - person sqlchild; 24.08.2012