Как сделать cron задачу на php

Как настроить запуск php скрипта через cron (php-fpm)?

Никогда не сталкивался с cron. Помогите, пожалуйста.

Есть сервер. Там php-fpm (php 5.5).

Нужно настроить запуск php скрипта через cron:
1. Каждую минуту без отправки результата на почту
2. Каждый час с отправкой результата на почту

Путь к скрипту /server/cron/cron.php. Попробовал инструкции нагуглить, ничего не получилось. Подозреваю, что дело в пути к php (как его узнать?).

Объясните популярно, как настроить cron.

Устанавливаем php5-cli
apt-get install php5-cli

2.
для отправки на почту воспользуемся mutt (почтовый клиент)
apt-get install mutt

сохраняемся (у меня SHIFT+Z 2раза)

Как сделать cron задачу на php. Смотреть фото Как сделать cron задачу на php. Смотреть картинку Как сделать cron задачу на php. Картинка про Как сделать cron задачу на php. Фото Как сделать cron задачу на php

> /dev/null — это перенаправление стандартного вывода (stdout) в /dev/null (в никуда)
2>&1 — это перенаправление стандартного потока ошибок (stderr) в стандартный вывод, то есть в данном случае тоже в никуда.
Попробуйте немного почитать о языке оболочки (sh, bash, zsh и т. п., чтобы понять, как это работает).

Получается, что если где-то в cron.php есть строчка
echo “Hello world!”
то мир этого приветствия никогда не увидет. Если бы этих «иероглифов» не было, то после каждого выполнения скрипта приветствие улетало бы почтой куда-то.

Куда уйдёт отчёт — отдельный вопрос. По умолчанию письмо отправляется на почту тому пользователю, от имени которого запущен скрипт. В большинстве систем фактически просто дописывается файл /var/mail/username, но это зависит от продуманности админа. Чтобы точно знать, куда уйдёт письмо, первой строкой в crontab пропишите, как здесь уже советовали,
MAILTO=my@mail.com
Но гораздо гибче и предсказуемей использовать не этот механизм, а прописать отправку отчётов внутри самого скрипта.

И да, тут правильно написали. Подумайте сто раз, прежде чем добавлять в cron скрипт на исполнение раз в минуту. Зачем оно Вам? Можно ли без этого обойтись? Всё таки это весомая нагрузка на сервер. К тому же, практика показывает, что очень немногие задачи требуется выполнять с такой частотой. Может, просто Ваше решение не оптимальное?

Источник

Как запускать cron чаще, чем раз в минуту при помощи PHP

Классический конфиг — файл с записями cron jobs в операционной системе Linux, выглядит следующим образом:

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

В итоге, минимально возможный интервал запуска команды — это один раз в минуту.

Для многих задач выполнение команды нужно намного чаще, например раз в 10 секунд. Для некоторых задач по автоматизации бизнес процессов максимально допустимая задержка часто составляет не более чем 1-1.5 секунды.

Разумеется, классический cron для этого не подходит — его нужно усовершенствовать.

Ниже представлена пошаговая реализация по созданию дополнительного функционала (на языке PHP) к классическому cron на Linux с применением дополнительной защиты от повторного запуска процессов.

Постановка задачи и настройка cron

Для примера будем использовать следующую задачу:

Итак, cron настроим в его максимальном виде, т.е. раз в минуту:

Выполнение одного цикла

Изначально следует определиться, с какой частотой мы будем запрашивать новые задачи в базе данных — в зависимости от этого будет меняться количество циклов и логический сон (функция sleep )

В текущем примере используется шаг равный 10 секундам. Следовательно количество циклов 60 / 10 = 6. Итого, общий код выглядит следующим образом:

Уточнение: в данном примере используется шаг равный 10 секундам, который может обеспечить минимальный интервал выполнения скрипта один раз в 10 секунд. Соответственно, для более частого выполнения следует изменить количество циклов и «время на сон».

Как избежать повторного выполнения задачи

В представленном виде есть одна неопределенность, а именно — повторное выполнение задачи в случае, если она уже начата. Это становится особенно актуально, если задача «сложная» и требует несколько секунд на ее реализацию.

Таким образом создается проблема повторного выполнения:

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

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

Основная модель проверки строится при помощи flock — функции, которая ставит и снимает блокировку с файла.

В исполнении PHP работу функции можно представить следующим образом:

Результат

Общий вид всего цикла выглядит следующим образом:

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

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

Источник

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

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

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

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

Например, если бы кто-то хотел выполнять задачу в 0:00 в первый день каждого месяца, то это выглядело бы примерно так:

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

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

Вдобавок к тому, что у нас есть, если мы переадресуем поток данных к устройству, которое не существует, то наверняка нужно также переадресовать стандартные ошибки. Мы можем сделать это, просто переадресовывая их в то же место, где и должно находиться наше устройство!

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

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

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

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

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

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

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

Теперь мы определим строку, которая будет присваиваться по умолчанию для временного cron файла, а затем объединим с полным путём, который вычислили раньше. Вот мы и получили то, что нам нужно.

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

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

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

Теперь, в пределах блока try, мы проверим, передают ли какие-либо аргументы в этот метод или нет. Если количество аргументов будет равно 0, то мы бросим новое исключение с соответствующим сообщением.

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

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

Вот именно для этого мы и написали блок try / catch! Теперь дополним это код вызовом метода error_message () для отображения ошибок!

После этого мы сольём данные в одно целое, которое будет содержать полный путь для временного cron файла.

Наконец, мы вызовем метод exec() и передадим строку с командой.

Теперь, когда мы можем создать новые cron задачи, по логике вещей, нам необходимо иметь возможность их удалить! Метод remove_cronjob() будет принимать один аргумент, представляющий из себя регулярное выражением. Этот regEx будет использоваться для того, чтобы найти соответствие задачи в пределах cronTab и удалить их.

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

Этот метод просто возвращает результат функции file_exists() в зависимости от того, существует ли временный cron файл.

Этот метод принимает сообщение об ошибке, которое мы хотим показать.

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

Заключение

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

Источник

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

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

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

Задания Cron

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

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

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

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

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

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

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

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

Как сделать cron задачу на php. Смотреть фото Как сделать cron задачу на php. Смотреть картинку Как сделать cron задачу на php. Картинка про Как сделать cron задачу на php. Фото Как сделать cron задачу на php

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

Как сделать cron задачу на php. Смотреть фото Как сделать cron задачу на php. Смотреть картинку Как сделать cron задачу на php. Картинка про Как сделать cron задачу на php. Фото Как сделать cron задачу на php

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если это статья для новичков, то совершенно не понятно куда писать команды этому крону типа:
0 0 * * * /usr/bin/php /home/логин/public_html/myscript.php

Просто в консоли вводишь последовательно команды.
echo “0 0 * * * /usr/bin/php /home/логин/public_html/myscript.php” | crontab
service cron reload

>> т.к. веб-сервер Apache не участвует в работе
A Nginx участвует?
А IIS?

Источник

Запуск PHP скрипта по расписанию cron. Когда не всё так ясно

Как сделать cron задачу на php. Смотреть фото Как сделать cron задачу на php. Смотреть картинку Как сделать cron задачу на php. Картинка про Как сделать cron задачу на php. Фото Как сделать cron задачу на php

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

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

Случай первый


В настройках операционной системы не указаны пути по умолчанию. Как следствие следующая команда в cron не будет выполнена.

Правильной командой будет второй вариант, где мы пропишем полный путь до интерпретатора php.

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

В команде для выполнения в cron прописывается путь к скрипту и только. В скрипте ставятся символы #!, а дальше просто пишем нужные нам команды на языке bash.

Случай второй


Выполнение скрипта при запросе из браузера приводит к выводу страницы в браузер. А при выполнении скрипта через cron приводит к выводу текста страницы в командную строку. Тут может быть несколько вариантов. Система может быть настроена на сохранение результатов вывода в консоль в виде файла. Причем файл этот может размешаться не в самом типичном месте. Постепенно это может забить всё пространство на диске. Часто под сайт дают место в 1 Гигабайт, 500 мегабайт. И даже встречались хостинги с 50 и 10 мегабайт под сайт.

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

Решение старо как мир. Нужно сделать перенаправление вывода из консоли в пустоту. Делается это добавлением команды в конце команды крона.

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

Случай третий


Ситуация проста. Нужно отладить скрипт, запускаемый планировщиком. Можно попытаться сделать это средствами php, заставлять скрипт писать логии и т.п. Но есть способ куда проще, нужно перенаправить вывод в файл. Команда проста, дополнительный параметр к нашей команде:

Её надо добавить в конце команды:

Знак «>» указывает системе о перенаправлении вывода. Далее имя файла. В нашем случае указан абсолютный путь. Этот пример не составляет труда найти в интернете. Но тут нас может поджидать неприятность, вытекающая из второго случая. Заботливый хостер автоматически добавляет перенаправление вывода в конце нашей строки. И иногда маскирует это. В итоге получается команда вида:

В итоге вывод снова перенаправлен в пустоту и выходной файл будет пуст. Тут хостеру можно указать на его ошибку, что он уж слишком перехитрил с настройками. А можно сразу воспользоваться костылём. После команды перенаправления в файл закончить команду символами &&. Эти два символа используются в командной строке для объединения нескольких команд в одной строке. Они дают командной строке понять, что команда окончена и дальше идет следующая команда. К ней и применяется перенаправление в пустоту. В итоге и перенаправление в пустоту осталось и лог файл записан верно. Пример команды:

Случай четвёртый

Первое, что находишь в интернете по этой проблеме – совет прописать в кроне команду смены директории:

Но в каких-то случаях это не помогает. Выход есть. Один из них взять всё в свои руки и задать недостающее окружение для работы скрипта. Информации про это в интернете уже больше.

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

Как видите, всё прописано функциями и утруждаться настройками не надо.

Источник

Leave a Reply

Your email address will not be published. Required fields are marked *