Почтовый робот и cron как выполнять регулярные действия в php


Содержание

Как создать работу cron с помощью PHP?

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

Пример

run.php (код, который будет выполняться каждую минуту)

cron.php

Предположим, что эти два файла находятся в одной папке.

Является ли код неправильным? Если не так, пожалуйста, скажите мне, как это исправить.

Это лучшее объяснение с кодом в PHP, который я нашел до сих пор:

Хотя синтаксис планирования нового задания может показаться сложным на первый взгляд, он на самом деле относительно просто понять, как только вы его сложите. Задача cron всегда будет содержать пять столбцов, каждый из которых представляет собой хронологический «оператор», за которым следует полный путь и команда для выполнения:

Каждый из хронологических столбцов имеет особое отношение к расписанию задачи. Они выглядят следующим образом:

Так, например, если бы планировалось задание на 12am в первый день каждого месяца, это выглядело бы примерно так:

0 0 1 * * home/path/to/command/the_command.sh

Если бы мы планировали запуск задачи каждую субботу в 8:30, мы бы записали ее следующим образом:

30 8 * * 6 home/path/to/command/the_command.sh

Существует также ряд операторов, которые можно использовать для дальнейшей настройки расписания:

Перейдите по ссылке для полной статьи, она объясняет:

  • Каков формат cronjob, если вы хотите ввести/отредактировать его вручную.
  • Как использовать PHP с библиотекой SSH2 для аутентификации в качестве пользователя, который вы хотите отредактировать crontab.
  • Полный класс PHP со всеми необходимыми методами аутентификации, редактирования и удаления записей crontab.

Настройка простой задачи cron на Linux

Недавно мне пришлось настраивать запланированную задачу на сервере, и в первый раз это трудно, и даже страшновато. Поэтому я решила написать статью об этапах настройки Cron . Мы создадим простой PHP-скрипт для отправки электронной почты один раз в день.

Необходимый базовый уровень

  • Базовый опыт работы с командной строкой;
  • Навыки работы с SSH на сервере Linux .

Задачи

  • Научиться настраивать простую запланированную задачу ( задание cron ) в среде Linux-сервера ;
  • Установить задачу cron для отправки электронной почты ежедневно в указанное время.

Отправка электронной почты с помощью PHP

Сначала нужно создать простой PHP-скрипт для тестирования Cron Linux настройки. Я собираюсь создать файл, который отправляет электронную почту:

Если вы не знакомы с PHP-функцией mail() ознакомьтесь с официальной документацией . Я устанавливаю переменные, задающие получателя, электронный адрес отправителя, тему, содержание письма и заголовки. Это не самый современный или безопасный способ отправки электронной почты. Но это работает, поэтому я собираюсь использовать его для тестирования. Сохраняем код в файле cron.php .

Путь к публичной папке будет зависеть от дистрибутива Linux , но я поместила файл cron.php в /var/www/html/crontest . Поэтому полный путь к моему скрипту будет следующим: /var/www/html/crontest/cron.php . Вы можете протестировать этот скрипт непосредственно в браузере. Если адрес вашего сайта example.com , скорее всего, адрес файла будет example.com/crontest/cron.php . Если вы запускаете файл и получаете электронное письмо, значит, скрипт работает.

Localhost не настроен для отправки PHP-почты , поэтому этот скрипт должен запускаться из среды Linux .

Основной синтаксис Cron

Есть полезный сайт под названием Crontab Generator , который может настроить Cron PHP , но сначала мы кратко рассмотрим основной синтаксис.

Пример работы Cron :

Части команды cron

Команда cron состоит из четырех основных частей:

Время выполнения — устанавливает минуты, часы, дни, месяцы и день недели.

Выполнение — задача cron должна вызвать PHP , который находится в папке /usr / bin / php .

Путь к скрипту — полный путь к файлу, который необходимо запустить.

Результат ( необязательно ) — можно записать результат в файл или отбросить эту часть > /dev/null 2>&1 .

В приведенном выше примере задача Cron Linux настроена на отправку электронной почты каждую минуту часа ежедневно. Звездочка — это подстановочный знак, обозначающий « все ».

  • Минуты — установите минуты, от 0 до 59;
  • Часы — установите часы, от 0 до 24;
  • Дни — установите день, от 1 до 31;
  • Месяцы — установите месяц, от 1 до 12 ( январь-декабрь );
  • Неделя — установите день недели, от 0 до 6 ( воскресенье — суббота ).

Вот несколько простых примеров:

Существуют и другие настройки, например, для нечетных / четных дней, каждые 5 минут и т. д. Также доступно множество ресурсов, на которых можно найти конкретные настройки.

Настройка задачи Cron

Если cron настроен под учетной записью root , тогда нужно запустить sudo перед запуском кода.

Команда cron называется crontab . Мы задаем для нашей задачи выполнение рассылки электронной почты один раз в день, так что полная команда будет такой:

После того, как вы зашли на сервер SSH , можно проверить, существуют ли другие текущие задачи. Это можно сделать с помощью следующей команды.

Теперь мы отредактируем crontab :

На этот момент вы, скорее всего, будете работать в редакторе vi , если вы никогда не меняли редактор своего сервера по умолчанию. В первый раз при настройке Cron это может немного сбивать с толку.

Вот что нужно сделать:

  1. Нажмите esc ;
  2. Нажмите i , чтобы начать редактирование файла;
  3. Вставьте команду cron в файл;
  4. Снова нажмите esc , чтобы выйти из режима редактирования;
  5. Введите :wq , чтобы сохранить изменения в файле ( w — write ) и выйти ( q — quit ).

Теперь crontab сохранен, и электронное письмо должно отправляться один раз в день в полночь. Вы можете установить * / 5 * * * * — каждые 5 минут, чтобы проверить его работу.

Также можно добавить в файл несколько задач cron . Для этого поместите каждую команду в отдельную строку.

Данная публикация представляет собой перевод статьи « Setting Up a Basic Cron Job in Linux » , подготовленной дружной командой проекта Интернет-технологии.ру

Почтовый робот и cron как выполнять регулярные действия в php

Cron — это планировщик заданий, который работает на Unix\Linux хостинге. Он позволяет автоматически выполнять определенные действия на сервере (запуск программ, скриптов и т.д.), с заданным временем или периодичностью.

Правильная настройка планировщика заданий Cron

Задания для Cron можно описать так — это несколько строк (одна строка — одно задание), в которых указывается периодичность запуска и команда (которая означает, что собственно нужно запустить):

30 3 * * 2 /yourdirectory/myscript.pl

Минуты Часы ДеньМесяца Месяц ДеньНедели Команда

Минуты — задается числом от 0 до 59

Часы — задается числом от 0 до 23

ДеньМесяца — задается числом от 1 до 31

Месяц — задается числом от 1 до 12

ДеньНедели — 1 — Понедельник, 2 — Вторник, 3 — Среда, 4 — Четверг, 5 — пятница, 6 — Суббота, 7 — Воскресенье

Таким образом в нашем примере (30 3 * * 2 /yourdirectory/myscript.pl) задние означает, что нужно каждый вторник, в 3 часа 30 минут ночи запускать файл /yourdirectory/myscript.pl

Также в каждом из полей мы можем использовать:

Написание через запятую: 2,5,16 — если написать такое в поле Часы, то задание будет запускаться в 2 часа ночи, в 5 часов утра и в 16 часов.

Интервал: 5-9 — если написать в это в поле Минуты, то задание будет запускаться каждую минуту в период с 5 по 9 мин.

Дополнительная периодичность: /4 — если написать такое в поле часы, то это будет означать что запуск будет происходить каждые 4 часа.

Важно! Звездочка (*) — означает все возможные значения! Таким образом, неопытный вебмастер который решит, что для запуска задания 1 числа каждого месяца достаточно написать * * 1 * * /yourdirectory/myscript.pl натыкается на то, что задание будет запускаться каждую минуту, в каждом часу.

Ниже, мы покажем более детальные примеры Cron-заданий и вам все станет более понятно.

Важно! /yourdirectory/myscript.pl — это должен быть абсолютный путь к файлу, а сам файл должен иметь определенные права доступа (минимум — право на выполнение и чтение для владельца файла 644).

Как и куда вводить Cron-задания?

Первый способ работы с Cron — это панель управления хостингом. Но в разных панелях настройка и управление осуществляются по разному:

cPanel: Панель управления -> Задания Cron

ISP Manager: Панель управления -> Планировщик (Cron)

Parallels Plesk: Панель управления -> Запланированные задачи

Если у вашего хостинг-провайдера нет возможности работать с заданиями через панель управления, то вся работа с Cron обычно производится через SSH-протокол. Здесь все просто — подключаетесь к серверу по SSH и вводите команды. Для подключения к серверу используют бесплатную программу PuTTY (как настроить), а команды вводят в командной строке.

Чтобы начать работу вводим команду

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

Если запустится более легкий редактор, то все отлично, если же ваш хостинг-провайдер его не поддерживает, то Google поможет разобраться с vi. Мы лишь кратко обозначим основные моменты:

Ввод текста — жмем клавишу i и редактор перейдет в режим ввода текста;

выйти из режима ввода текста — Esc

Удалить символ — x (если вы находитесь в режиме ввода теста, то чтобы удалить символ сначала нажмите Esc, а потом x);

Сохранить и выйти — :wq (если вы находитесь в режиме ввода теста, то чтобы удалить символ сначала нажмите Esc, а потом :wq).

Важно! Вводя задания для Cron после каждой строчки нужно обязательно нажимать Enter, даже если эта строчка единственная.

Чтобы посмотреть уже существующие задания для Cron вводим crontab -l

Задания для Cron с полезными примерами

Правила составления Cron-заданий смотрим вверху статьи. Запускать задание каждые 2 часа в 0 минут (каждый день, каждого месяца)

Запускать задание каждый раз после перезагрузки сервера

Запускать задание по средам в 3 часа 20 минут ночи (каждый день, каждого месяца)

20 3 * * 3 /yourdirectory/myscript.pl

Запускать задание 14 марта в 2 часа 10 минут ночи

1 0 14 3 * /yourdirectory/myscript.pl

Запускать задание ежемесячно 1 числа в 3 часа 15 минут ночи (в каждом месяце)

15 3 1 * * /yourdirectory/myscript.pl

Запуск PHP-файлов по расписанию с помощью Cron

Для запуска PHP-скриптов через Cron можно использовать специальный интерпретатор. К сожалению мы не можем дать вам инструкцию по его работе, т.к. у разных провайдеров может использовать разный софт. Поэтому многие вебмастера запускают PHP-файлы с помощью WGET, для этого используем такую запись в crontab:

30 3 * * 2 root wget -O — -q -t 1 http://mysite.com/file.php

«-O -» означает, что Cron не будет создавать лишние файлы, а будет работать через консоль. Это позволяет избежать захламления сервера.

«-q» отключает вывод операции на экран

«-t 1» разрешается только одна попытка соединения.

http://mysite.com/file.php — путь к вашему PHP-фалу (не обязательно указывать абсолютный путь).

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

30 3 * * 2 root wget -O — -q -t 1 ‘http://mysite.com/file.php’

Также, существует еще один способ запуска:

30 3 * * 2 /usr/bin/wget -O — -q -t 1 http://mysite.com/file.php

Но в этом случае вам нужно знать путь к папке wget на своем сервере (чаще всего /usr/bin/wget или /usr/local/bin/wget).

Если вы до сих пор не поняли, что означают «30 3 * * 2», то вверху статьи мы это описали.

Какие есть ограничения для работы Cron?

Единственное ограничение, которое может относится именно к Cron’ну — это ограничение на периодичность запуска. Например чтобы не перегружать сервер, провайдер может разрешать запуск Cron-заданий не чаще, чем один раз в час или полчаса. В остальном на эти задания действуют все те же ограничение, что и на сервер в целом (память ОЗУ, размер файла, время его выполнения и т.д.). Все эти ограничения задаются хостинг-провайдером и узнать их можно только у него.

Что будет с Cron при перезапуске сервера?

Он перезагрузится вместе с сервером. ваши задания не пропадут, они будут работать как и ранее.

Получение отчета о работе Cron на почту

Cron можно настроить так, чтобы на электронную почту приходили сообщения с результатами запущенных заданий. Эта функция также может быть полезна, для уведомления на случай ошибки. Для получения отчета на e-mail нужно редактируя crontab (перед заданиями) написать такую строку:

где info@mydomain.com — это e-mail на который будут приходить письма. Также можно добавить несколько адресов, через запятую.

Есть еще один момент, вам на почту будет приходить еще и результат работы скрипта. например, если скрипт пишет на экране какую-то надпись, то эта же надпись придет на вашу почту вместе с отчетом. Если это вас раздражает, то добавьте в конце задания строку > /dev/null 2>&1

Создание сайта на WordPress

Что как и почему в WordPress

Задания Cron на выполнение php-скриптов

Задания Cron

Cron — это демон (программа, которая постоянно работает в системе в фоновом режиме), представляющий собой планировщик задач в UNIX-подобных операционных системах (включая сервер Apache), который в определенное время автоматически выполняет задания. Пример задания — копирование базы данных в определенное место на сайте (создание резервной копии).

Каждый пользователь системы может добавлять свои задания, указывая, в какое время и какие скрипты нужно выполнять от его имени. Задания могут выполняться, например, раз в день, раз в месяц, раз в год.. На вашем хостинге могут действовать ограничения на общее количество заданий и на то, как часто может выполняться задание (Например, не чаще 1 раза в 10 минут и не более 10 cron-заданий).

Задание (таблица crontab) включает 6 разделов, разделяемых пробелами или табуляцией.

Первые пять разделов задают время выполнения скрипта:
минуты: 0-59
часы: 0-23
день месяца: 1-31
месяц: 1-12
день недели: 0-7 (0 и 7 — воскресенье)
* — диапазон с первого до последнего.

команда задает скрипт, который нужно выполнять, например, скрипт на Perl или на php. Если команда передает текст в стандартный вывод, этот текст отправляется на e-mail пользователя, но стандартный вывод можно перенаправить в /dev/null:

Примеры задания времени выполнения скрипта:
0 22 * * * — каждый день в 22:00
0 0 1 * * — раз в месяц
0,30 10-22 * * * — каждые полчаса между 10:00 и 22:00
0/10 * * * * — каждые 10 минут

Права доступа

На скрипт рекомендуется выставить права доступа 755 (права на исполнение).

Добавление задания Cron в ISPmanager

В ISPmanager параметры выполнения для крона задаются в отдельных полях формы.

Войдите в Главное — Планировщик и нажмите кнопку «Создать«. В появившейся форме задайте Команду и Период (периодичность выполнения), а также выберите опцию Не отправлять отчёт по e-mail.

Илон Маск рекомендует:  Создание сайта что нужно знать

Команда — это путь до интерпретатора (у меня сработало просто php), пробел и полный путь до скрипта:

*** Полный путь до скрипта включает путь к корневой директории сервера, который можно узнать, выполнив в браузере:

Период — периодичность выполнения задания можно выбрать из списка (базовый режим):
каждый час — выполнение в 0 минут каждого часа.
каждый день — выполнение ежедневно ровно в 00:00.
раз в неделю — выполнение каждое воскресенье ровно в 00:00.
раз в месяц — выполнение первого числа каждого месяца ровно в 00:00.
раз в год — выполнение каждый год 1 января ровно в 00:00.

или задать вручную (экспертный режим)

Добавление задания Cron в cPanel

В cPanel войдите в «Дополнительно», «Задания Cron» и заполните форму добавления задания.

Особенности выполнения php-скрипта в задании Cron

В выполняемом php-скрипте не должны использоваться переменные окружения. Например, адреса следует прописывать явно. Дело в том, что при выполнении cron-задания в php-скрипте недоступны серверные переменные (например, $_SERVER, $_GET), т.к. веб-сервер Apache не участвует в работе демона cron и не заполняет переменные окружения.

В команде необходимо указать путь к php (может отличаться для разных хостингов), например, /usr/bin/php, затем пробел и полный путь к файлу скрипта:

Пример Cron-задания для выполнения php-скрипта один раз в день (0 0 * * * — задает периодичность)

Задания Cron на выполнение php-скриптов : 13 комментариев

А как подавить отсылку на емайл сообщений крона?

команда >/dev/null 2>&1

Доброго времени.
У вас отличный блог, странно, почему я на него раньше не попадал.
Столкнулся, не в первый раз уже, с работой cron в вордпресс.
В свое время, вырубил его функционал в wp-config, потому что при обращении к wp-cron.php с хостинга возвращает 404.
Покурив интернет, выяснил, что это происходит когда в hosts на хостинге прописано 127.0.0.1 localhost, а wordpress-у нужно, в данном случае, чтоб был прописан адрес моего блога. Хостинг виртуальный, провайдер что-либо делать отказался. Ну я отключил. А сейчас решил поставить wp super cache, но сия зверюга натыкаясь на 404 ставиться не хочет.
Не подскажете, где бы его чего почитать более-менее толковое про этот чертов функционал? Второй раз за месяц по интернету прохожусь с этими вопросами, но такое ощущение, что это или заговор, или я не там ищу.
Хочу отпинать или вордпресс, чтоб дергался крон сервера хостинга, либо научить кэширующий плагин работать с внешним кроном.
Благодарю.

Спасибо пост реально очень помог

Скрипты могут не работать из-за указания расширения в названии файла

А можно «для особо одаренных» или, вернее, для вообще ничего не знающих в php подробнее написать, куда вставить строку-php или что там еще.
Задание в Cron — это логически понятно — выставить время, а вот мне например, надо выставить задание для создания backup сайта. Какую команду и куда ее вписать?

Уууу полегчало, оказывается что так просто :)

Описано легко и понятно. Только у Вас получается, что в неделе 8 дней (от 0 до 7)
Поправьте, плз, а то чайники запутаются. :)

День недели может быть задан числом от 0 до 7, причем 0 и 7 соответствуют воскресенью.

Здравствуйте, у меня такой вопрос, куда вписывать путь к файлу PHP? хотелось бы по подробнее.

Можно ли отправить резервную копию на e-mail? (именно копию, а не отчёт). Если да, то как?

Что такое CRON и как правильно его настроить?

Cron применяют для автоматизации выполнения поставленных задач на сервере. Он работает на Linux и отлично подходит для того, чтобы запустить программу или скрипт на определенное время и с определенной периодичностью, запланировав это действие заранее.

Настройка планировщика заданий Cron

Необходимые к выполнению задания записываются в виде строк, в которых необходимо указать период включения и команду, указывающую, что именно необходимо запустить. Для каждого задания отводится отдельная строка. Например:

На более понятном простому пользователю языке тут обозначены: Минуты/Часы/ДеньМесяца/ДеньНедели/Команда. Данный пример означает, что в 3:30 ночи, каждый вторник, Сron должен запускать файл с названием youdirectory/myscript.pl.

Если перечислить значения через запятую, например в пункте «День» написать 2,4,6, то файл будет запускаться в указанное время каждый вторник, четверг и субботу.

Если задать значения через дефис, то задача будет исполняться в указанном интервале времени. Например, если в пункте «Часы» задать 3-7, то файл будет запускаться каждый час с 3 до 7 утра.

Также можно задать периодичность, написав в графе времени, например, в «Часы» /12. Тогда задача будет исполняться каждые 12 часов.

Важно знать, что «*» означает не отсутствие значения, а все возможные значения. То есть, если задать * * * * 1 /yourdirectory/myscript.pl, желая, чтобы файл запускался каждый понедельник, то это окажется совершенно неверным и файл будет запускаться каждую минуту.

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

Из представленных примеров становится понятно, что данный планировщик задач в Linux является очень удобным инструментом, поэтому предлагаем вам более подробно ознакомиться с некоторыми его особенностями.

Как устанавливать задачи для Cron

Наиболее простым и распространенным методом работы с Cron является панель администрирования хостинга. Однако, у различных панелей конфигурация Cron происходит по-разному.

Иногда случается, что хостинг не предоставляет возможности работы с Cron через панель администрирования. В такой ситуации используют SSH-протокол. С помощью него подключаются серверу, используя программу PuTTY, и вводят задачи в командной строке.

Для начала работы следует ввести команду:

Далее вы попадете в vi – текстовый редактор, однако, эти редакторы могут быть разными у разных хостингов. Если вы не знакомы с работой в vi, то вы можете ввести команду: EDITOR=ee crontab –e, которая перенаправит вас в более простой и понятный редактор.

В случае, когда хостинг не осуществляет поддержку открывшегося редактора, придется разобраться с работой vi:

  • для ввода текста необходимо перейти в одноименный режим, нажав кнопку «i»;
  • для выхода из режима воспользуйтесь кнопкой «Esc»;
  • для удаления символа в режиме ввода текста воспользуйтесь клавишами «Esc», а затем «x»;
  • сохранения и выхода из файла нажмите «:wq»;
  • в обязательном порядке нажимайте клавишу «Enter» в конце каждой строчки, это необходимо для работы Cron;
  • для просмотра уже имеющихся задач в Cron введите команду crontrab-l.

Примеры задач для Cron в linux

— Исполнять задание каждые 6 часов в 30 минут каждого дня каждого месяца:

— Исполнять задание после каждой перезагрузки:

— Исполнять задание 15 числа каждого месяца в 00 часов 00 минут:

PHP-файлы

Чтобы запустить PHP-скрипты, обычно используют интерпретатор. Универсальной инструкции по его работе нет, так как разные хостинги используют разнообразный софт. В следствие этого часто прибегают к помощи WGET для запуска PHP в Cron. Вводим следующую запись:

Разберем более подробно:

  • «-O-» — не дает Cron создавать дополнительные файлы, тем самым, избавляя сервер от лишнего хлама, так как работа происходит в консоли;
  • «q» — операции больше не выводятся на экран;
  • «t-1» — разрешение лишь одной попытки соединения.

Ограничения Cron

У самого Cron имеется всего одно ограничение – период исполнения задач. Если вы перегружаете сервер своего хостинга, он может поставить запрет на запуск Cron чаще, чем раз в несколько минут или час. Кроме этого Cron ограничен только ресурсами сервера, такими как: оперативная память, объемы данных, время выполнения команд и т.д.

Если сервер перезагрузится, то Cron сохранит все ваши задачи, перезагрузившись вместе с ним.

Отчет

У Cron существует настройка, чтобы настроить уведомления о его работе на электронную почту. Это особенно полезно, если при работе случится какая-либо ошибка. Чтобы включить такие уведомления на почту, необходимо в crontab вписать строчку:

После MAILTO= указывается необходимая почта. Указать их можно сразу несколько, перечислив через запятую. Теперь, если вдруг случится ошибка, вы будете проинформированы об этом. При чем, к вам на почту будут приходить и результаты работы скриптов. Однако, если данная функция вам мешает, ее можно и отключить, введя в конце задачи команду > /dev/null 2>&1.

  • Tweet
  • Share 0
  • +1
  • LinkedIn 0
  • VKontakte

2 thoughts on “Что такое CRON и как правильно его настроить?”

Почему может не работать wday? Указываю 6 — всё равно выполняется вне зависимости от дня недели. Нужна первая суббота, делаю примерно так:
0 21 1-7 * 6 /usr/local/etc/test.sh 2>>/var/log/mycron.log

Здравствуйте, вот как планироватьзапуск первой субботы каждого месяца: 0 0 1-7 * * [ $(/usr/bin/date +\%u) == 7 ] && command

Cron: настройка и запуск

Введение


Размещая сайт, мы желаем добиться бесперебойной работы без нашего участия.

Значит, требуется автоматизировать процессы, и тут на помощь приходит cron.

Cron — программа, демон для автоматического запуска программ и скриптов на сервере в необходимое время.

Crontab в панели управления Timeweb

Если ваш аккаунт оплачен, и вас не уличили в спам-рассылке, то раздел Crontab доступен и работоспособен:

Интерфейс Crontab в панели управления Timeweb дружелюбен и интуитивно понятен: даже начинающие пользователи, до этого не имевшие опыта работы с cron, легко разберутся в том, как создавать задачи. Создав задачу, вы сможете в автоматическом режиме делать бэкапы, рассылки, чистить кэш и выполнять другие типовые действия.

Crontab в панели управления Timeweb поможет любому пользователю автоматизировать свои задачи и достичь нужный ему результат.

После основной информации я расскажу о нюансах, которые важно учитывать при работе с cron.

В разделе Crontab создаются новые задачи. Для этого потребуется заполнить поля:

  • Название . Это имя нашей задачи.
  • Тип файла и путь до файла . В зависимости от того, на каком языке написан сценарий, выбираем тип файла и путь до него. Если в задаче запускается скрипт, требующий переменные веб-сервера, запуск напрямую через php-интерпретатор приводит к ошибкам. Поэтому в случае, когда Вы используете скрипт, работающий при запуске через адресную строку браузера, необходимо выбирать тип файла «HTTP-запрос» и указывать URL для запроса аналогично тому, как он указывается в адресной строке «ваш_сайт/путь/до/скрипта/script.php?параметр1=значение1&параметр2=значение2».
  • Периодичность запуска . Популярные интервалы запуска выбираем из списка. Если необходим запуск в другое время, то используем продвинутые настройки. В отличие от консоли, в панели Timeweb время указывается в обратном порядке. Но каждый блок подписан, что помогает не запутаться.

При необходимости указывайте один ящик администратора в разделе Crontab. На этот ящик будут приходить сообщения в том случае, если бы при запуске скрипта в консоли появилось бы сообщение.

Нюансы

Небольшие нюансы, о которых стоит помнить при работе с cron.

1. Cron работает, если аккаунт оплачен и нет ограничений.

Проверить статус можно создав файл с расширением php (например twtest.php) с кодом:

И обратившись к файлу в браузере.

В браузере увидите информацию:

u > — говорит о том, что cron и почта доступны

u > — пишем в поддержку

2. Файл, который запускаете, должен иметь права на чтение и исполнение (r+x).

По умолчанию файлы на хостинге создаются с правами 600. Поменять права на нужные можно по ssh командой:

или в Файловом менеджере, об этом у Timeweb есть инструкция: http://timeweb.com/ru/help//pages/viewpage.action?page >

3. Дабы не захламлять e-mail лишними письмами, настройте часто исполняемые скрипты на запись лога в файл , а не в консоль.

CRON по SSH

Настройка планировщика по ssh описана столько раз, что нового рассказать не получится.

Подключение по ssh подробно описано в справочном центре Timeweb:

После подключения, прочтите статью с информацией о командах ssh:

После прочтения надо найти файл со скриптом, перемещаясь между директориями командой cd. Найдя файл введите pwd и скопируйте путь (пример «/home/c/cc123456/public_html/test/»)

Если не знаете какие права у файла введите:

При подключении по ssh редактировать задачи можно командой

В первый раз сервер попросит выбрать редактор:

Система указывает на простой редактор nano под цифрой 2. Если не рассчитали силы или случайно выбрали vi, не пугайтесь, нажмите Esc, затем введите двоеточие q и нажмите enter.

Для того, чтобы сменить редактор, введите команду:

и выберете nano.

Задания пишутся по строкам. Пример:

Значения первых пяти значений:

  • 1 минуты — число от 0 до 59
  • 2 часы — число от 0 до 23
  • 3 день месяца — число от 1 до 31
  • 4 номер месяца в году — число от 1 до 12
  • 5 день недели — число от 0 до 7 (0-Вс,1-Пн,2-Вт,3-Ср,4-Чт,5-Пт,6-Сб,7-Вс)

Для каждого параметра возможно задать необходимое количество значений через запятую. Например, если в поле «часы» написать 8,23, то задание будет запущено в 8 часов утра и в 23 часа вечера. Можно задать интервал: 9-18 будет означать, что программа запустится каждый час в период с 9 до 18 часов включительно. Символ ‘*’ означает «все возможные значения». Например, указание ‘*’ в поле «часы» будет означать «запускать каждый час». Символ ‘/’ служит для указания дополнительной периодичности задания. Например, ‘*/3’ в поле «минуты» означает «каждые три минуты».

Далее указываем путь до интерпретатора. На серверах Timeweb по умолчанию установлена версия php 5.3. Наш предполагаемый скрипт работает на 5.6. Указать требуемую версию php так:

Последняя запись указывает на путь до файла и название файла, который запускаем.

Нюансы

  1. При изменении в панели управления в разделе «Crontab» удалятся изменения записей сделанных по ssh!
  2. Если определены оба поля «день месяца» и «день недели» , то такое задание будет выполняться в каждый указанный день недели независимо от дня месяца. Например, следующая команда будет выполняться в 9 часов 19 минут каждую среду и каждое 7 число месяца, даже если 7 число не совпадает со средой.

Частные случаи

Для запуска задачи чаще, чем раз в минуту, используем sleep.

Для этого пишем в crontab:

для запуска файла каждые 30 секунд.

Иногда при использовании планировщика запуска программ cron неизвестно, сколько длится выполнение скрипта. Для избежания двойного запуска скрипта требуется проверка на завершение предыдущего запуска скрипта.

Логичным вариантом будет создание lock файла и при запуске скрипта проверять наличие файла. Но на хостинге Timeweb, как и на других хостингах, присутствует ограничение по процессору. Скрипт зависит от условий и времени выполнения, а значит, мы не можем предугадать время выполнения скрипта. Если скрипт выполнится с нарушением правил и ограничений ( https://timeweb.com/ru/services/hosting/rules/ ), то процесс завершится со стороны хостинга. Тогда lock файл не будет удален, а значит, и скрипт не будет запускаться по крону, пока файл не будет удалён.

Маэстро из отдела инженеров рассказал, как решить задачу.

Для начала создаём sh скрипт в файл /home/c/cc123456/tmp/twtest.sh:

В панели управления в разделе crontab выбираем тип «Исполняемый бинарный файл».

В поле “Полный путь” пишем:

  • /home/c/cc123456/tmp/twtest.sh — наш скрипт проверки
  • /opt/php56/bin/php — путь до нужного интерпретатора
  • /home/c/cc123456/tmp/twtest.php — путь до нашего скрипта

Указываем необходимое время запуска и придумываем название.

Заключение

Теперь вы знаете, как работать с cron и автоматически запускать задачи. Более подробную информацию о cron ищите в «man cron». Удачи!

Почтовый робот и cron как выполнять регулярные действия в php

You are using an outdated browser. Please upgrade your browser.

By signing up, you agree to our Terms of Service and Privacy Policy.

Вам необходимо отсылать автоматические поздравления или напоминания о важных событиях, или нужно делать переодическую проверку обратных ссылок каталога? Тогда Cron станет просто необходимым инструментом для Вашей работы, который облегчит выполнения многих задач. В данной статье рассмотрим особенности и возможности работы утилиты Cron (система для автоматического запуска программ и скриптов на сервере в определённое пользователем время).

Cron – планировщик задач , который запускает определенные задания с заданной периодичностью. Другими словами, программа выполняет задачи по расписанию. Применять такой планировщик можно для многих целей, например, для запуска скрипта, который очищает кэш Ваших скриптов или отсылает уведомления зарегистрированным пользователям сайта. Все действия происходят автоматически в указанное время.

Илон Маск рекомендует:  ob_get_contents - возвращает содержимое буфера вывода

Принцип работы планировщика задач : Cron является постоянно запущеным в фоновом режиме, каждую минуту он проверяет необходимость выполнения действия в соответствии с файлами конфигурации. Также происходит проверка на наличие изменений в файлах конфигурации. Если изменения были, то cron вновь загружает обновленные файлы. Это гарантирует почти моментальное принятие любых изменений и добавлений в свои файлы.

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

Редактировать файл crontab можно с помощью интерфейса панели управления и используя специальный инструмент с таким же названием – crontab.

Из чего состоит файл конфигураций?

Конфигурационный файл состоит из строк. Каждая строка описывает программу, которая будет запущена по расписанию. В каждой строке 6 полей. Поля имеют назначение:

  1. Минуты (0-59)
  2. Часы (0-23)
  3. День месяца (1-31)
  4. Месяц в году (1-12)
  5. День недели (0-6)
  6. Программа, которая будет запущена

Первые 5 полей можно записать следующими способами:

  1. Символом *
  2. Списком через запятую (1,2,3)
  3. Диапазоном через тире (1-31)
  4. Шагом значений диапазона (например */2 означает через_раз).

Как получить дополнительную информацию о Cron?

Вы можете воспользоваться встроенной справочной системой, в случае возникновения дополнительных вопросов по работе Cron. Для этого нужно набрать в коммандной строке сервера:

man cron – информация об особенностях функционирования cron;

man 1 crontab – все о способах использования crontab;

man 5 crontab – о формате конфигурационных файлов для cron.

Как сделать запуск php-скрипта из cron?

Строка, которая делает запуск имеет следующий вид:

где /usr/local/bin/php – ведет до php-интерпретатора (на разных серверах путь может быть разным. Определять нужно с помощью команды which php);

/home/user/www/site1/public_html/script.php – путь до скрипта необходимо указывать от корня сервера.

Как видим, подобный планировщик задач весьма полезный для разного рода задач. Он отлично справляется с заданными целями. К примеру, его часто используют для выполнения бэкапов сайта в одно и то же время. Согласитесь, это довольно удобно.

Наиболее часто используемые и полезные комманды в cron :

crontab -l – вывод списка текущих задач в расписании cron.

crontab -l > /home/crontab.backup – выгрузка списка текущих задач в файл.

crontab /home/crontab.backup – загрузка списка задач из файла.

crontab -e – редактирование списка задач.

crontab -r – очистка списка.

Также важно помнить о том, что cron не следит за выполнением поставленных Вами задач, он только запускает их в работу. В случае, если команда не успела отработать до следующего запуска, cron все также сделает следующий запуск команды. Синтаксис cron довольно простой и не сложный в изучении.

Полезные команды Linux, которые необходимо знать подробнее тут .

Обращайтесь, компания Hyper Host™ рада будет предоставить хостинг для любых Ваших сайтов!

anonymus88

шпаргалки склеротиков

http://debback.blogspot.com/2008/02/cron-mailto-exim.html

cron имеет простую и замечательную возможность направлять вывод выполняемых команд на почту. Вот сижу я, работаю, а cron занимается своими делами: обновляет библиотеки из svn, делает резервные копии баз данных, отсылает уведомление моим друзьям, чтоб они не забыли поздравить меня с Днем рождения. И все это происходит тихо и неслышно. Иногда просто забываешь о том, что у тебя бэкапится база данных, которая уже сто лет как переименована, а потому уже вовсе и не бэкапится. Еще хуже, если во время рассылки уведомления о ДР произошел тотальный и фатальный сбой. И тогда ты сидишь один, с тортом из крема и энного количества свечек, и недоумеваешь: почему же так вышло. А вышло так потому, что вывод команды, содержащий в себе уведомление об ошибке, в лучшем случае остался только в логах, прочитать которые приходит мысль только после того, как День рождения был безвозвратно испорчен :-)

Итак, настраиваем отправку вывода команд на свой почтовый ящик!

Берем cron. Лучше его, конечно же, брать за crontab. Поэтому мы набираем в консоли:

Далее вверху файла добавляем такую строчку:

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

* * * * * echo ‘Вот и наступило долгожданное время: ‘ ; date

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

Но. Писем нет! Если Вы продолжили читать, то, наверное, таки нет :-) Вероятно, причина в том, что наш sendmail любезно отправил письмо в папку /var/mail. Толку от такого письма не намного больше, чем от лог-файла. Что же делать? Настраивать систему пересылки писем.

В моем Debian Lenny (testing) утилиту sendmail заменяет exim4. Если у вас та же ситуация, то его, родимого, мы и будем настраивать. Но, для начала, давайте все-таки убедимся. Набираем в консоли:

Если в первой строчке вывода команды вы видите следующее:

File: `/usr/sbin/sendmail’ -> `exim4′

то приступаем к настройке exim.

Загвоздка вся в том, что exim у нас настроен так, что работает только с локальным хостом, и во внешний мир не суется. Нам же нужно отправлять письма на внешний адрес. В конфиги сегодня лезть не будем — упростим себе жизнь. Набираем в консоли:

$ sudo dpkg-reconfigure exim4-config

И поэтапно отвечаем на вопросы.

— На странице «Общий тип почтовой конфигурации» выбираем «интернет-сайт; прием и отправка почты напрямую, используя SMTP».
— Далее вводим «Почтовое имя» — введите имя свое компьютера.
— В поле «IP-адреса, с которых следует ожидать входящие соединения SMTP», вводим свой локальный адрес: 127.0.0.1. Если только вы не собираетесь организовывать публичный почтовый сервер. И ни в коем случае не оставляйте поле пустым. А то мало ли кто к вашему серверу подключится и что Вам пришлет ;-)
— В качестве имени домена назначения опять же введите название своей машины.
— Если у вас модемное подключение к интернету, то согласитесь с сокращением DNS-запросов до минимума.

Остальные поля оставляем незаполненные или выбранные по умолчанию.

Закончили настройку exim. Засекаем время (пару минут хватит), выкуриваем сигарету/чупа-чупс/печенюшку, целуем жену/ребенка/начальника и возвращаемся к любимому и ненавистному компьютеру, дабы проверить электронную почту. Пришла — поздравляю! Не пришла — примите мои соболезнования, а лучше напишите мне и попробуем разобраться вместе ;-) Кроме того, можно найти полезную информацию в статье о настройке различных MTA для отправки через внешний SMTP.

Как создать работу cron с помощью PHP?

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

Пример

run.php (код, который будет выполняться каждую минуту)

cron.php

Предположим, что эти два файла находятся в одной папке.

Является ли код неправильным? Если не так, пожалуйста, скажите мне, как это исправить.

Это лучшее объяснение с кодом в PHP, который я нашел до сих пор:

Хотя синтаксис планирования нового задания может показаться сложным на первый взгляд, он на самом деле относительно просто понять, как только вы его сложите. Задача cron всегда будет содержать пять столбцов, каждый из которых представляет собой хронологический «оператор», за которым следует полный путь и команда для выполнения:

Каждый из хронологических столбцов имеет особое отношение к расписанию задачи. Они выглядят следующим образом:

Так, например, если бы планировалось задание на 12am в первый день каждого месяца, это выглядело бы примерно так:

0 0 1 * * home/path/to/command/the_command.sh

Если бы мы планировали запуск задачи каждую субботу в 8:30, мы бы записали ее следующим образом:

30 8 * * 6 home/path/to/command/the_command.sh

Существует также ряд операторов, которые можно использовать для дальнейшей настройки расписания:

Перейдите по ссылке для полной статьи, она объясняет:

  • Каков формат cronjob, если вы хотите ввести/отредактировать его вручную.
  • Как использовать PHP с библиотекой SSH2 для аутентификации в качестве пользователя, который вы хотите отредактировать crontab.
  • Полный класс PHP со всеми необходимыми методами аутентификации, редактирования и удаления записей crontab.

Почтовый робот и cron как выполнять регулярные действия в php

Управление Cron средствами php

Для тех, кто не в курсе, cronTab, или “CronTable”, — это специальный инструмент, доступный на Linux, который облегчает планирование повторных задач, таким образом, освобождает нас от «обезьяньей работы».

В уроке мы создадим динамический класс PHP, который будет использовать безопасное подключение, и предоставит нам возможность управления cronTab!

Краткий обзор Crontab

Я думаю, никто не будет спорить с тем, что возможность автоматизировать какие-то процессы — это очень крутая и полезная вещь! Список наших возможностей стремится к бесконечности: мы можем автоматизировать поддержку базы данных SQL, отправлять электронные письма подписчикам, управлять различными задачами, анализировать работу и производительность нашего сайта, грабастать RSS ленты — cron просто великолепен!

Несмотря на то что на первый взгляд синтаксис планирования новой cron задачи может не на шутку озадачить новичка, со временем и практикой всё станет довольно-таки просто. Если коротко, то у cron задачи есть пять колонок, каждая из которых представляет хронологический ‘оператор’ (время запуска), и путь к самому файлу, который необходимо выполнить:

Как вы уже поняли, каждая из колонок представляет собой цифру (время), относящееся к той или иной задаче. Давайте рассмотрим их поподробнее:

Minutes представляют минуты данного часа, 0-59;
Hours представляют часы данного дня, 0-23;
Days представляют дни данного месяца, 1-31;
Months представляют месяцы данного года, 1-12;
Dayofweek представляет день недели, с воскресенья до субботы, в цифровой форме, как 0-6;

1 Minutes [0-59]
2 Hours [0-23]
3 Days [1-31]
4 Months [1-12]
5 Days of the Week [Numeric, 0-6]
6
7 * * * * * home/path/to/command/the_command.sh

Например, если бы кто-то хотел выполнять задачу в 0:00 в первый день каждого месяца, то это выглядело бы примерно так:
1 0 0 1 * * home/path/to/command/the_command.sh

Если бы мы хотели наметить задачу, которая бы выполнялась каждую субботу в 8:30, то мы написали бы следующий код:
1 30 8 * * 6 home/path/to/command/the_command.sh

Также существует множество операторов, которые могут использоваться для того, чтобы настроить график ещё более детально:

Запятые используются, чтобы разделять значения в любой из колонок задачи;
Тире используются, чтобы определить диапазон значений;
Звёздочка говорит о том, что нужно использовать ‘все’ или ‘каждое’ значение;

По умолчанию cronTab отправляет почтовое уведомление всякий раз, когда запланированная задача выполнена. Тем не менее, при многих обстоятельствах, это только часть того, что необходимо сделать. Мы можем легко расширить эту функциональность, переадресовывая поток данных этой команды к ‘нулевому устройству’ или устройству /dev/null. По сути, в нашем случае это будет файл, который отклоняет каждый идущий к нему запрос. Переадресация потока данных осуществляется с помощью оператора >. Давайте рассмотрим пример того, как мы можем переадресовать стандартный поток данных к нулевому устройству, используя cron задачу, которая будет запускаться каждую субботу в 8:30:
1 30 8 * * 6 home/path/to/command/the_command.sh >/dev/null

Вдобавок к тому, что у нас есть, если мы переадресуем поток данных к устройству, которое не существует, то наверняка нужно также переадресовать стандартные ошибки. Мы можем сделать это, просто переадресовывая их в то же место, где и должно находиться наше устройство!
1 30 8 * * 6 home/path/to/command/the_command.sh >/dev/null 2>&1
Шаг 1. Чертёж

Для того чтобы управлять cronTab при помощи PHP, мы будем нуждаться в возможности выполнять команды на удаленном сервере. К счастью, PHP предоставляет нам простой способ сделать — через библиотеку SSH2. Для тех, у кого данной библиотеки нет, придётся предпринять следующие шаги:

Мы начнем наш класс с объявления четырёх приватных свойств:

$connection представляет наше подключение / ресурс;
$path представит путь для файла;
$handle представит название нашего временного cron файла;
$cron_file представляет полный путь и название временного cron файла;

Наш класс должен быть в состоянии соединиться с сервером и подтвердить подлинность пользователя, для того, чтобы только администратор мог пользоваться данной утилитой. Таким образом, мы установим связь SSH2 и подтвердим подлинность ее в пределах конструктора.

После того, как пользователь авторизуется, ему понадобится метод, который будет связан с выполнением различных команд, точнее сказать ответственным за управление задачами. Мы назовем этот метод exec (). Данный метод мы будем вызывать из других методов нашего класса, когда нам понадобится выполнить команду на удаленном сервере.

Затем, нам понадобится возможность вписать cronTab в файл — на это у нас должны быть соответствующие права. Также не нужно забывать, что мы так же должны быть в состоянии удалить этот файл, когда он нам больше не будет нужен. Итак, к нашему методу прибавляется ещё несколько файлов, таких как write_to_file () и remove_file () для добавления и удаления файлов.

Конечно, мы будем также нуждаться в возможности создавать и удалять cron задачи. Таким образом, мы определим методы append_cronjob () и remove_cronjob ().

После того, как мы удалили единственный или последний cronjob, нам понадобится возможность удалить весь cronTab вместо того, чтобы пытаться создать пустой. Для этого мы напишем метод remove_crontab (), чтобы реализовать данную функциональность.

Наконец, мы создадим два вспомогательных метода для нашего класса. Один из них будет возвращать булево значение, проверяя существование временного cron файла. Второй будет использоваться для того, чтобы показать сообщения об ошибке, если таковое возникнет в ходе работы скрипта. Мы назовем эти методы crontab_file_exists () и error_message ().
01 path, которое будет хранить полный путь по умолчанию для наших временных cron файлов.

Для этого мы будем использовать волшебную константу PHP __DIR__, которая позволит нам определить путь скрипта, который мы вызываем. Однако, есть случаи, где эта константа не может быть определена, поэтому нам необходимо проверить, доступно ли нам значение из константы __DIR__.

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

Для того чтобы извлечь только путь, нам пригодится функция strrpos (), которая вернёт нам позицию слеша в значении __FILE__. Это значение, которое мы сохраним как $path_length, даст нам набор символов, не включая последний разделитель директорий.

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

В substr () мы передадим 3 аргумента:

строку, с которой мы работаем;
начальную позицию, которая в нашем случае равна 0;
конечную позицию, которая хранится в переменной $path_length;

После выполнения данных функций у нас будет сформирован полный путь, в котором нуждается скрипт.
1 function __construct($host=NULL, $port=NULL, $username=NULL, $password=NULL)
2 <
3 $path_length = strrpos(__FILE__, «/»);
4 $this->path = substr(__FILE__, 0, $path_length) . ‘/’;
5 >

Теперь мы определим строку, которая будет присваиваться по умолчанию для временного cron файла, а затем объединим с полным путём, который вычислили раньше. Вот мы и получили то, что нам нужно.
1 function __construct($host=NULL, $port=NULL, $username=NULL, $password=NULL)
2 <
3 $path_length = strrpos(__FILE__, «/»);
4 $this->path = substr(__FILE__, 0, $path_length) . ‘/’;
5 $this->handle = ‘crontab.txt’;
6 $this->cron_file = «<$this->path><$this->handle>»;
7 >

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

В пределах этого блока мы сначала проверим, чтобы нам были доступны все аргументы. Для этого будем использовать функцию is_null (), которая возвращает истину или ложь. Если какой-либо из этих аргументов будет равен NULL, то мы выбросим новое исключение с соответствующим сообщением.
01 function __construct($host=NULL, $port=NULL, $username=NULL, $password=NULL)
02 <
03 $path_length = strrpos(__FILE__, «/»);
04 $this->path = substr(__FILE__, 0, $path_length) . ‘/’;
05 $this->handle = ‘crontab.txt’;
06 $this->cron_file = «<$this->path><$this->handle>»;
07
08 try
09 <
10 if (is_null($host) is_null($port) is_null($username) is_null($password)) throw new Exception(«Please specify the host, port, username and password!»);
11 >
12 catch
13 <
14
15 >
16 >

Илон Маск рекомендует:  Cgi common gateway interface

Затем, мы определим $this->connection, передав аргументы $host и $port в функцию ssh2_connect () для того, чтобы установить соединение с сервером. Данный метод возвращает false, если соединение не было установлено.

Так как мы используем нашу собственную обработку ошибок, то нам также нужно предусмотреть обработку этих сообщений. Если скрипту не удастся соединиться с сервером, то мы выбросим новое исключение с соответствующим сообщением.
01 function __construct($host=NULL, $port=NULL, $username=NULL, $password=NULL)
02 <
03 $path_length = strrpos(__FILE__, «/»);
04 $this->path = substr(__FILE__, 0, $path_length) . ‘/’;
05 $this->handle = ‘crontab.txt’;
06 $this->cron_file = «<$this->path><$this->handle>»;
07
08 try
09 <
10 if (is_null($host) is_null($port) is_null($username) is_null($password)) throw new Exception(«Please specify the host, port, username and password!»);
11
12 $this->connection = @ssh2_connect($host, $port);
13 if ( ! $this->connection) throw new Exception(«The SSH2 connection could not be established.»);
14 >
15 catch
16 <
17
18 >
19 >

Теперь мы попытаемся определить подлинность пользователя, используя функцию ssh2_auth_password (), в которую передадим подключение, имя пользователя и его пароль. ssh2_auth_password () также возвращает булево значение, которое характеризует результат выполнения авторизации на сервере.
01 function __construct($host=NULL, $port=NULL, $username=NULL, $password=NULL)
02 <
03 $path_length = strrpos(__FILE__, «/»);
04 $this->path = substr(__FILE__, 0, $path_length) . ‘/’;
05 $this->handle = ‘crontab.txt’;
06 $this->cron_file = «<$this->path><$this->handle>»;
07
08 try
09 <
10 if (is_null($host) is_null($port) is_null($username) is_null($password)) throw new Exception(«Please specify the host, port, username and password!»);
11
12 $this->connection = @ssh2_connect($host, $port);
13 if ( ! $this->connection) throw new Exception(«The SSH2 connection could not be established.»);
14
15 $authentication = @ssh2_auth_password($this->connection, $username, $password);
16 if ( ! $authentication) throw new Exception(«Could not authenticate ‘<$username>‘ using password: ‘<$password>‘.»);
17 >
18 catch
19 <
20
21 >
22 >

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

Так, в блоке catch мы будем использовать метод getMessage, для того чтобы получить и показать сообщение, определенное в исключении.

Вы, наверное, уже поняли, что мы будем показывать исключения через метод error_message (), который определим чуть позже.
01 function __construct($host=NULL, $port=NULL, $username=NULL, $password=NULL)
02 <
03 $path_length = strrpos(__FILE__, «/»);
04 $this->path = substr(__FILE__, 0, $path_length) . ‘/’;
05 $this->handle = ‘crontab.txt’;
06 $this->cron_file = «<$this->path><$this->handle>»;
07
08 try
09 <
10 if (is_null($host) is_null($port) is_null($username) is_null($password)) throw new Exception(«Please specify the host, port, username and password!»);
11
12 $this->connection = @ssh2_connect($host, $port);
13 if ( ! $this->connection) throw new Exception(«The SSH2 connection could not be established.»);
14
15 $authentication = @ssh2_auth_password($this->connection, $username, $password);
16 if ( ! $authentication) throw new Exception(«Could not authenticate ‘<$username>‘ using password: ‘<$password>‘.»);
17 >
18 catch (Exception $e)
19 <
20 $this->error_message($e->getMessage());
21 >
22 >
Шаг 3. Выполнение множественных команд

Метод, который мы сейчас напишем, будет ответственен за выполнение команд на удаленном сервере. Это сопоставимо с ручным входом на сервер через программу PuTTY. Для того чтобы сохранить гибкую функциональность, мы сделаем методы публичными, чтобы пользователи могли выполнить любые команды, которые им необходимы для работы. Также мы сделаем возможным любое число аргументов. Эти аргументы представляют собой команды, которые будут запускаться функцией ssh2_exec ().

Итак, первая вещь, которую мы сделаем в этом методе, — это определим переменную, представляющую количество аргументов, которые передаются в метод. Мы будем использовать функцию PHP func_num_args(), для того чтобы получить это количество.
1 public function exec()
2 <
3 $argument_count = func_num_args();
4 >

Теперь, в пределах блока try, мы проверим, передают ли какие-либо аргументы в этот метод или нет. Если количество аргументов будет равно 0, то мы бросим новое исключение с соответствующим сообщением.
01 public function exec()
02 <
03 $argument_count = func_num_args();
04
05 try
06 <
07 if ( ! $argument_count) throw new Exception(«There is nothing to execute, no arguments specified.»);
08 >
09 catch
10 <
11
12 >
13 >

Затем, используем функцию func_get_args () для создания множества всех аргументов, которые передали в этот метод.

Используя тернарный оператор, мы определим новую переменную, $command_string, как единую строку команды в Linux, которую будем выполнять.

Если у нас действительно будут множественные команды, то мы будем использовать функцию PHP, implode(), для того чтобы разобрать множество аргументов. В функцию implode() мы передаём два аргумента: строку и разделитель. Мы отделим каждый элемент разделителем &&, который позволит нам выполнять множественные команды, последовательно, на одной линии!

Если же будет введена только одна команда, то мы определим её как $arguments [0], который будет представлять первую и единственную команду.
01 public function exec()
02 <
03 $argument_count = func_num_args();
04
05 try
06 <
07 if ( ! $argument_count) throw new Exception(«There is nothing to execute, no arguments specified.»);
08
09 $arguments = func_get_args();
10
11 $command_string = ($argument_count > 1) ? implode(» && «, $arguments) : $arguments[0];
12
13 >
14 catch
15 <
16
17 >
18 >

Теперь, когда все подготовительные работы завершены, мы можем попытаться выполнить их, используя функцию ssh2_exec (). Мы передадим подключение $this->connection и строку команды $command_string. После этого метод ssh2_exe() возвратит результат.

И в этом случае, мы будем использовать блок try / catch для того, чтобы иметь возможность отловить любые сообщения об ошибке. Также мы будем выбрасывать наше собственное исключение с соответствующим сообщением.
01 public function exec()
02 <
03 $argument_count = func_num_args();
04
05 try
06 <
07 if ( ! $argument_count) throw new Exception(«There is nothing to execute, no arguments specified.»);
08
09 $arguments = func_get_args();
10
11 $command_string = ($argument_count > 1) ? implode(» && «, $arguments) : $arguments[0];
12
13 $stream = @ssh2_exec($this->connection, $command_string);
14 if ( ! $stream) throw new Exception(«Unable to execute the specified commands: <$command_string>«);
15
16 >
17 catch
18 <
19
20 >
21 >

Вот именно для этого мы и написали блок try / catch! Теперь дополним это код вызовом метода error_message () для отображения ошибок!
01 public function exec()
02 <
03 $argument_count = func_num_args();
04
05 try
06 <
07 if ( ! $argument_count) throw new Exception(«There is nothing to execute, no arguments specified.»);
08
09 $arguments = func_get_args();
10
11 $command_string = ($argument_count > 1) ? implode(» && «, $arguments) : $arguments[0];
12
13 $stream = @ssh2_exec($this->connection, $command_string);
14 if ( ! $stream) throw new Exception(«Unable to execute the specified commands: <$command_string>«);
15
16 >
17 catch
18 <
19 $this->error_message($e->getMessage());
20 >
21
22 return $this;
23 >
Шаг 4. Запись cronTabв файл

Следующий метод, write_to_file (), будет ответственен за запись cronTab во временный файл или создание нового файла. Для этого нам потребуется 2 аргумента:

путь для временного файла;
имя файла, который будет создан;

С аргументами поступим точно так же, как и в нашем конструкторе, а именно — установим значения по умолчанию в NULL.
1 public function write_to_file($path=NULL, $handle=NULL)
2 <
3
4 >

Первое, что мы здесь сделаем, так это проверим при помощи метода crontab_file_exists () существует ли cron файл. Если файл действительно существует, то создавать его не нужно. Если его нет, то мы будем использовать тернарный оператор, чтобы проверить наличие значений в переменных $path и $handle. Если хотя бы один из них будет равен NULL, то мы запустим процесс, который их определит.

После этого мы сольём данные в одно целое, которое будет содержать полный путь для временного cron файла.
01 public function write_to_file($path=NULL, $handle=NULL)
02 <
03 if ( ! $this->crontab_file_exists())
04 <
05 $this->handle = (is_null($handle)) ? $this->handle : $handle;
06 $this->path = (is_null($path)) ? $this->path : $path;
07
08 $this->cron_file = «<$this->path><$this->handle>»;
09 >
10 >

Затем мы будем использовать команду Linux crontab, с-l набором аргумента. Затем, используя Linux оператор >, мы перенаправим стандартный вывод, или STDOUT, в наш временный cron файл! Перенаправление вывода к файлу, используя оператор>, создаст файл, если он не существует.
01 public function write_to_file($path=NULL, $handle=NULL)
02 <
03 if ( ! $this->crontab_file_exists())
04 <
05 $this->handle = (is_null($handle)) ? $this->handle : $handle;
06 $this->path = (is_null($path)) ? $this->path : $path;
07
08 $this->cron_file = «<$this->path><$this->handle>»;
09
10 $init_cron = «crontab -l > <$this->cron_file>»;
11 >
12 >

Наконец, мы вызовем метод exec () и передадим строку с командой.
01 public function write_to_file($path=NULL, $handle=NULL)
02 <
03 if ( ! $this->crontab_file_exists())
04 <
05 $this->handle = (is_null($handle)) ? $this->handle : $handle;
06 $this->path = (is_null($path)) ? $this->path : $path;
07
08 $this->cron_file = «<$this->path><$this->handle>»;
09
10 $init_cron = «crontab -l > <$this->cron_file> && [ -f <$this->cron_file> ] > <$this->cron_file>»;
11
12 $this->exec($init_cron);
13 >
14
15 return $this;
16 >
Шаг 5. Удаляем временный файл

Метод remove_file () прост настолько, насколько это может быть! Тут мы воспользуемся вспомогательным методом crontab_file_exists (), чтобы проверить существование временного cron файла и затем выполним команду Linux, чтобы удалить его. Как обычно мы также возвратим $this.
1 public function remove_file()
2 <
3 if ($this->crontab_file_exists()) $this->exec(«rm <$this->cron_file>»);
4
5 return $this;
6 >
Шаг 6. Создание новой cron задачи

Метод, который мы сейчас напишем, будет создавать новую cron задачу. Метод append_cronjob () будет принимать один аргумент $cron_jobs, представляющий собой последовательность или множество последовательностей cron задач.

В самом начале этого метода мы проверим, является ли аргумент $cron_jobs равным NULL. Если да, то мы вызовем метод error_message(), чтобы остановить скрипт и показать пользователю сообщение об ошибке.
1 public function append_cronjob($cron_jobs=NULL)
2 <
3 if (is_null($cron_jobs)) $this->error_message(«Nothing to append! Please specify a cron job or an array of cron jobs.»);
4
5 >

Затем мы определим новую переменную $append_cronfile с текстом «echo», после которой стоит пробел и кавычка. Эту строку мы будем использовать для различных cron задач. Для конкатенации строк будем использовать выражение .=

Используя тернарный оператор, мы определим, содержит ли $cron_jobs множество команд. Если это будет так, то нам нужно разделить команды символом n так, чтобы каждая cron задача располагалась на своей собственной строке. Если там только одно выражение, ничего из выше перечисленного мы не делаем.

По сути, мы можем просто вывести нашу задачу в cron файл, перенаправив процесс вывода. Таким образом, используя оператор конкатенации строк, мы добавим закрывающуюся кавычку, также как и Linux оператор >>. Оператор >, в отличие от этого оператора >>, всегда переписывает файл. Оператор >> добавляет информацию в конец файла. Так при использовании этого оператора, мы не будем переписывать существующие cron задачи.
01 public function append_cronjob($cron_jobs=NULL)
02 <
03 if (is_null($cron_jobs)) $this->error_message(«Nothing to append! Please specify a cron job or an array of cron jobs.»);
04
05 $append_cronfile = «echo ‘»;
06
07 $append_cronfile .= (is_array($cron_jobs)) ? implode(«n», $cron_jobs) : $cron_jobs;
08
09 $append_cronfile .= «‘ >> <$this->cron_file>»;
10
11 >

Прежде чем выполнить команду через метод exec (), сначала необходимо вызвать метод write_to_file(), чтобы создать временный cron файл. После выполнения этих двух команд, следует вызвать remove_file(), чтобы удалить временный файл.
01 public function append_cronjob($cron_jobs=NULL)
02 <
03 if (is_null($cron_jobs)) $this->error_message(«Nothing to append! Please specify a cron job or an array of cron jobs.»);
04
05 $append_cronfile = «echo ‘»;
06
07 $append_cronfile .= (is_array($cron_jobs)) ? implode(«n», $cron_jobs) : $cron_jobs;
08
09 $append_cronfile .= «‘ >> <$this->cron_file>»;
10
11 $install_cron = «crontab <$this->cron_file>»;
12
13 $this->write_to_file()->exec($append_cronfile, $install_cron)->remove_file();
14
15 return $this;
16 >
Шаг 7. Удаление существующих cron задач

Теперь, когда мы можем создать новые cron задачи, по логике вещей, нам необходимо иметь возможность их удалить! Метод remove_cronjob () будет принимать один аргумент, представляющий из себя регулярное выражением. Этот regEx будет использоваться для того, чтобы найти соответствие задачи в пределах cronTab и удалить их.
1 public function remove_cronjob($cron_jobs=NULL)
2 <
3 if (is_null($cron_jobs)) $this->error_message(«Nothing to remove! Please specify a cron job or an array of cron jobs.»);
4
5 $this->write_to_file();
6
7 >

Если cronTab не будет пуст, то тогда посчитаем элементы в $cron_array, используя функцию count(). Полученное значение сохраним в переменной $original_count.
01 public function remove_cronjob($cron_jobs=NULL)
02 <
03 if (is_null($cron_jobs)) $this->error_message(«Nothing to remove! Please specify a cron job or an array of cron jobs.»);
04
05 $this->write_to_file();
06
07 $cron_array = file($this->cron_file, FILE_IGNORE_NEW_LINES);
08
09 if (empty($cron_array)) $this->error_message(«Nothing to remove! The cronTab is already empty.»);
10
11 $original_count = count($cron_array);
12
13 >

Теперь у нас есть возможность узнать содержит ли $cron_jobs несколько значений или нет. Если да, то мы воспользуемся циклом foreach для обработки каждого значения. На каждом шаге будем использовать функцию preg_grep(). Эта изящная функция, мало чем отличается от preg_match(). В этом случае, однако, мы хотим получить элементы множества, которые не соответствуют шаблону. Таким образом, у нас будет множество всей cron работы, которой мы хотим сохранить!
01 public function remove_cronjob($cron_jobs=NULL)
02 <
03 if (is_null($cron_jobs)) $this->error_message(«Nothing to remove! Please specify a cron job or an array of cron jobs.»);
04
05 $this->write_to_file();
06
07 $cron_array = file($this->cron_file, FILE_IGNORE_NEW_LINES);
08
09 if (empty($cron_array)) $this->error_message(«Nothing to remove! The cronTab is already empty.»);
10
11 $original_count = count($cron_array);
12
13 if (is_array($cron_jobs))
14 <
15 foreach ($cron_jobs as $cron_regex) $cron_array = preg_grep($cron_regex, $cron_array, PREG_GREP_INVERT);
16 >
17 else
18 <
19
20 >
21 >

Если аргументом $cron_jobs не будет множество, то мы продолжим двигаться в почти такой же манере, но без циклов.
01 public functionremove_cronjob($cron_jobs=NULL)
02 <
03 if (is_null($cron_jobs)) $this->error_message(«Nothing to remove! Please specify a cron job or an array of cron jobs.»);
04
05 $this->write_to_file();
06
07 $cron_array = file($this->cron_file, FILE_IGNORE_NEW_LINES);
08
09 if (empty($cron_array)) $this->error_message(«Nothing to remove! The cronTab is already empty.»);
10
11 $original_count = count($cron_array);
12
13 if (is_array($cron_jobs))
14 <
15 foreach ($cron_jobs as $cron_regex) $cron_array = preg_grep($cron_regex, $cron_array, PREG_GREP_INVERT);
16 >
17 else
18 <
19 $cron_array = preg_grep($cron_jobs, $cron_array, PREG_GREP_INVERT);
20 >
21 >

Далее мы сравним значение $cron_array с $original_count. Если длины будут идентичны, то мы просто вызовем метод remove_file(), чтобы удалить временный cron файл. Если они не будут соответствовать, то мы удалим существующий cronTab, а затем создадим новый!
01 public function remove_cronjob($cron_jobs=NULL)
02 <
03 if (is_null($cron_jobs)) $this->error_message(«Nothing to remove! Please specify a cron job or an array of cron jobs.»);
04
05 $this->write_to_file();
06
07 $cron_array = file($this->cron_file, FILE_IGNORE_NEW_LINES);
08
09 if (empty($cron_array)) $this->error_message(«Nothing to remove! The cronTab is already empty.»);
10
11 $original_count = count($cron_array);
12
13 if (is_array($cron_jobs))
14 <
15 foreach ($cron_jobs as $cron_regex) $cron_array = preg_grep($cron_regex, $cron_array, PREG_GREP_INVERT);
16 >
17 else
18 <
19 $cron_array = preg_grep($cron_jobs, $cron_array, PREG_GREP_INVERT);
20 >
21
22 return ($original_count === count($cron_array)) ? $this->remove_file() : $this->remove_crontab()->append_cronjob($cron_array);
23 >
Шаг 8. Удаление cronTab

Удаление всего cronTab сделать очень просто. По существу мы только выполним команду crontab -r, которая удалит весь cronTab для данного пользователя. Так как crontab был удален, мы могли бы также удалить временный cron файл.
1 public function remove_crontab()
2 <
3 $this->exec(«crontab -r»)->remove_file();
4
5 return $this;
6 >
Шаг 9. Несколько вспомогательных методов

Теперь давайте рассмотрим несколько вспомогательных методов, которые мы использовали во время написания основного скрипта.
1 $this-> crontab_file_exists ()

Этот метод просто возвращает результат функции file_exists() в зависимости от того, существует ли временный cron файл.
1 private function crontab_file_exists()
2 <
3 return file_exists($this->cron_file);
4 >
5 $this-> error_message ($error)

Этот метод принимает сообщение об ошибке, которое мы хотим показать.
1 private function error_message($error)
2 <
3 die(«»);
4 >
Шаг 10. Собираем всё в кучу

Теперь давайте посмотрим, как пользоваться созданным нами детищем:

1 $crontab = new Ssh2_crontab_manager(‘11.11.111.111′, ’22’, ‘my_username’, ‘my_password’);

Создание одной задачи

1 $crontab = new Ssh2_crontab_manager(‘11.11.111.111′, ’22’, ‘my_username’, ‘my_password’);
2 $crontab->append_cronjob(’30 8 * * 6 home/path/to/command/the_command.sh >/dev/null 2>&1′);

Создание нескольких задач

1 $crontab = new Ssh2_crontab_manager(‘11.11.111.111′, ’22’, ‘my_username’, ‘my_password’);
2 $new_cronjobs = array(
3 ‘0 0 1 * * home/path/to/command/the_command.sh’,
4 ’30 8 * * 6 home/path/to/command/the_command.sh >/dev/null 2>&1′
5 );
6
7 $crontab->append_cronjob($new_cronjobs);

Удаление одной задачи

1 $crontab = new Ssh2_crontab_manager(‘11.11.111.111′, ’22’, ‘my_username’, ‘my_password’);
2
3 $cron_regex = ‘/home/path/to/command/the_command.sh/’;
4
5 $crontab->remove_cronjob($cron_regex);

Удаление нескольких задач

1 $crontab = new Ssh2_crontab_manager(‘11.11.111.111′, ’22’, ‘my_username’, ‘my_password’);
2
3 $cron_regex = array(
4 ‘/0 0 1 * */’,
5 ‘/home/path/to/command/the_command.sh/’
6 );
7
8 $crontab->remove_cronjob($cron_regex);
Заключение

Вот и всё! Надеюсь, урок был для вас полезен, и вы сможете применить накопленные знания в ваших проектах. Удачи!

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL