Создание сценария MySQL-запроса в Unix с использованием демона в PHP - PullRequest
0 голосов
/ 29 октября 2010

Я пытаюсь заставить работать "на" в определенное время, для целей тестирования я использую $ time, но это будет дата-время, которое я получу из отдельного запроса MySQL.В командной строке я иду так:

echo "mysql -e 'UPDATE admin SET row1=row2 WHERE id=1;'" | at now

И я получаю «работу 36 на 2010-10-28 15:05».в PHP я попытался сделать так:

exec("\"mysql -e 'UPDATE admin SET row1=row2 WHERE id=1'\" | at $time");

Но запрос не запускается.Хуже, я понятия не имею, что происходит.

echo exec('whoami'); 

возвращает "демон".Как я могу повторить любой ответ, который я получаю от команды exec?в идеале я думаю, что это будет «работа 36 в 2010-10-28 15:05» или что-то подобное.

Кроме того, у меня есть файл .my.cnf в моей директории, который определяет БД, логин и парольчтобы использовать, нужно ли демону также, чтобы они работали?

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

  • A.Запустите запрос MySQL, чтобы получить дату / время и идентификатор
  • B.Запланируйте обновление для строк, соответствующих идентификатору на дату / время

Я уже сделал «A» и использовал «1» для идентификатора и «сейчас» для времениво время тестирования.Я посмотрю в PDO.

Ответы [ 4 ]

0 голосов
/ 29 октября 2010

Отсутствует echo в вашем втором утверждении / exec? (и я бы предпочел использовать popen / proc_open at $time и fwrite команду для выполнения at (после чего вы закрываете входной поток, затем программу. Используйте atq, чтобы проверить ее работал, и имейте в виду, что текущее использование может быть запрещено at заданий (обычно находятся в таких файлах, как /etc/at.allow или /etc/at.deny)

0 голосов
/ 29 октября 2010

Возможно, вы в safe_mode?Если да, то ваш | автоматически экранируется.Согласно руководству :

При включенном безопасном режиме строка команды экранируется с помощью escapeshellcmd ().Таким образом, эхо у |эхо х становится эхо у \ |эхо х.

0 голосов
/ 29 октября 2010

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

$output = array();
$return = false;
$last_line = exec("\"mysql -e 'UPDATE admin SET row1=row2 WHERE id=1'\" | at now", $output, $return);

var_dump($last_line);
var_dump($output);
var_dump($return);

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

$last_line = exec("echo \"mysql -e 'UPDATE admin SET row1=row2 WHERE id=1'\" | at now", $output, $return);
0 голосов
/ 29 октября 2010

Я не очень знаком с командой at , но, похоже, она помогает запускать команды в определенное время.

Если вы пытаетесь написать запланированный скрипт на PHP, есть лучшие способы сделать это. Просто напишите сценарий CLI и используйте cron для его планирования. Как отмечает Svisstack, если вы выполняете запросы MySQL, используйте встроенную функцию, такую ​​как PDO, а не системные команды.

Если вы просто запускаете системные команды, я не уверен, почему вы используете PHP;)

...