2012-06-26 1 views
1

Я искал, но не смог найти именно то, что искал.PHP `date()` Отличается от Unix `date` Command

У меня есть страница настроек PHP, на которой админы с моего сайта могут выбрать час дня для ежедневного запуска сценария Cron. В моем crontab у меня скрипт работает каждый час. Когда скрипт запускается, он проверяет, соответствует ли текущий час часу, который запросила страница настроек.

Причина, по которой я сделал это, потому что я абсолютно не мог понять способ редактировать файл crontab через PHP, несмотря на то, что он много тестировал и изучал предмет. Бонусные очки, если вы можете помочь мне выяснить способ сделать это.

Настоящая причина, по которой я создаю этот вопрос, состоит в том, что у меня возникают некоторые проблемы с моим временем в Unix-сервере. Когда на моей машине localhost (IIS) скрипт Cron выполняет каждый час, как это предполагалось, но когда я переместил все на свою машину Unix Amazon, время отключилось ровно через пять часов.

Задача Cron по-прежнему работает по часам, как и предполагалось, но когда скрипт PHP проверяет, соответствует ли текущее время (с использованием date("G")) времени настроек, оно не будет работать так, как предполагалось. Конечно, в конечном итоге он будет обработан ровно через пять часов.

Я не думаю, что это совпадение, что я живу в центральном часовом поясе, в котором также бывает пять часов, поэтому я почти уверен, что это связано с этим.

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

одно:

У меня есть эта строка кода в моем сценарии. Что-нибудь еще мне нужно поделиться?

date_default_timezone_set('America/Chicago');

EDIT: объяснение того, что ваш "исправить" это было бы весьма признателен.

+0

Возможный дубликат: http://stackoverflow.com/questions/8244128/why-does-the-date-php-and-date-unix-does-not-match – zessx

+0

Его лучше рассчитать все в формате UTC. Когда вы показываете это пользователю, просто применяйте часовой пояс. –

+0

@samsamX Спасибо за быстрый ответ. Сейчас я смотрю больше. Я также надеялся получить некоторые отзывы о редактировании Crontab через PHP с этим. –

ответ

2

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

  • Для редактирования кронтаб, вам нужно отредактировать кронтаб для пользователя веб-сервера, а не привилегированного пользователя, или, если вы собираетесь редактировать корневой кронтаб вам нужно настроить Sudo, чтобы пользователь веб-сервер может редактировать что конкретно кнтанб. Парадигма, которую вы имеете на месте, вероятно, лучше, просто для установки одного cron затем поместите основную часть вашей логики в скрипт PHP, вызванный cron.
  • Проблема, с которой вы столкнулись, в другую дату php, - это обмануть другой поток, как было предложено первым комментарием. Если у вас есть доступ к php.ini, вы должны установить date.timezone соответственно там. Кроме того, если пользователи не находятся в часовом поясе, в окне появляется сообщение, вам придется приспособиться к смещению часового пояса независимо от того, что.
  • Еще одна вещь, о которой стоит упомянуть, заключается в том, что вы можете получить значение даты из ОС через PHP через что-то вроде $sLinuxDate = shell_exec('date');. Вероятно, вы хотите установить часовую зону между PHP &, установленную OS корректно через php.ini, как я уже упоминал.
+0

Спасибо за подробный ответ. Мне удалось найти работу. Строка, в которой я устанавливал 'date_default_time_zone()' в PHP, выполнялась в моих заголовочных файлах, но моя задача Cron не включала их, чтобы исключить небольшой фрагмент. D'о! Я думаю, что я просто переместил его в файл .ini, поэтому я больше не сталкиваюсь с такими проблемами. И если вы не возражаете против текущей настройки выполнения задания каждый час, я просто буду придерживаться ее так, как она есть. Я не был уверен, что то, что я делал, было семантически правильным или вне пределов. Мне не нравится иметь дело с неудобными быстрыми исправлениями. +++ :) –

+0

Да, это должно быть лучше. Для выполнения сценария потребуется немного секунды, если ему нечего делать, и вы держите файл crontab в загромождении. Кроме того, вам не нужно иметь дело с блокировкой файлов и т. Д., Чтобы поддерживать crontab. – quickshiftin