2014-01-17 4 views
17

Я хотел бы очистить мою базу данных SQL от всех желающих старше 1 недели, и я хотел бы сделать это в ночное время. Итак, я собираюсь создать работу cron. Как я могу запросить mySQL без необходимости вводить мой пароль вручную каждый раз?Запуск mySQL-запроса в качестве задания cron?

Запрос в PHP выглядит следующим образом:

mysql_query("DELETE FROM tbl_message WHERE DATEDIFF(NOW() , timestamp) >=7"); 

Есть ли способ запустить это как сценарий оболочки? Если нет, есть ли способ заставить cron запустить php-файл?

ответ

31

Попробуйте создать скрипт, как показано ниже:

#!/bin/bash 

mysql --user=[username] --password=[password] --database=[db name] --execute="DELETE FROM tbl_message WHERE DATEDIFF(NOW() , timestamp) >=7" 

Вы можете добавить это в хрон

+2

Этот ответ так же хорош, как и мой. Это зависит только от того, хотите ли вы сделать это через php или нет. – miyasudokoro

+1

Это также зависит от того, хотите ли вы распространять свои учетные данные базы данных в большем количестве мест, чем это необходимо. Опция 'event_scheduler' является улучшением в этом отношении, поскольку она содержится в базе данных, и ее установка может полностью контролироваться версиями в качестве сценария миграции. – kungphu

8

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

# crontab -e 
00 * * * * /usr/local/bin/php /home/path/script.php 

В моей системе, я даже не придется поставить путь к установке PHP:

00 * * * * php /home/path/script.php 

С другой стороны, вы не должны использовать mysql, поскольку он устарел, если вы не используете более старую установку php. Read here для сравнения.

44

Мне лично проще использовать планировщик событий MySQL, чем cron.

Включить его

SET GLOBAL event_scheduler = ON; 

и создать событие, как это:

CREATE EVENT 
ON SCHEDULE EVERY 1 DAY 
STARTS '2014-01-18 00:00:00' 
DO 
DELETE FROM tbl_message WHERE DATEDIFF(NOW() , timestamp) >=7; 

и это все.

Подробнее о синтаксисе here и here - это более общая информация о нем.

0

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

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

Затем я попытался включить события ON в phpMyAdmin, но снова на общем хосте это было нет. Извините fancyPants.

Итак, я обратился к встраиванию SQL-скрипта в файл PHP. Я использовал пример [здесь] [1]

[1]: https://www.w3schools.com/php/php_mysql_create_table.asp сохранил его в подпапке где-то в безопасности и добавил пустой index.php для хорошей меры. Затем я смог проверить, что этот PHP-файл (и мой SQL-скрипт) работает из строки URL-адреса браузера.

Все до сих пор. На CRON. Следуя приведенному выше примеру, почти сработало. Я закончил тем, что вызвал PHP до пути для моего * .php-файла. В противном случае CRON не знал, что делать с файлом.

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

00 * * * * php mywebsiteurl.com/wp-content/themes/ForteChildTheme/php/DeleteExpiredAssessment.php

Для окончательного тестирования с CRON я сначала установить его, чтобы запустить каждую минуту и ​​имел оповещение по электронной почте включено. Это быстро подтвердило, что оно работает так, как планировалось, и я изменил его на один раз в день.

Надеюсь, это поможет.

Смежные вопросы