Автоматизировать PHP-скрипт
В рамках импорта данных я создал PHP-файл, который запускается на веб-сервере/локальном хосте для ввода данных в базу данных из исходного файла CSV. Проблема в том, что эту страницу нужно открывать вручную, так что по сути это все равно, что запускать за ней реальный скрипт MySQL.
Как я могу добавить этот файл для ежедневного запуска в определенный день на сервере без "человеческого" взаимодействия.
Я попробовал некоторые другие решения, такие как: Запуск PHP в расписании задач, а затем его запуск с аргументом - f C:\Apache24\htdocs\my_phpfile.php
Однако это, похоже, не привело к запуску PHP-файла, потому что при просмотре информации в таблице он не обновлялся. Я знаю, что PHP-файл работает, так как я запустил его вручную через браузер.
Пожалуйста, не мог бы я получить какой-нибудь совет/помощь? Каков наилучший способ сделать это?
В настоящее время я тестирую среду на своем ноутбуке с Windows 10, но в конечном итоге это будет работать на сервере Windows 2012.
Спасибо.
3 answers
Вы можете запускать php-скрипты в планировщике задач (я часто это делаю), но имейте в виду следующие моменты:
Вы запускаете его как php C:\Apache24\htdocs\my_phpfile.php
PHP должен быть на вашем ПУТИ, иначе вам нужно будет перейти непосредственно к нему:
c:\php\php C:\Apache24\htdocs\my_phpfile.php
Запуск его таким образом - это запуск в режиме командной строки, а не в Интернете. Когда вы запускаете скрипт в Apache, среда сильно отличается от CLI. Ваш сценарий может работать не так, как вы ожидаете, из-за разницы в среде. например,
- в текущий каталог отличается,
- переменных $_SERVER нет,
- $_ENV будет другим,
- нет.htaccess,
- пользователь будет другим, и, следовательно, права доступа к файлам
- загруженные модули могут быть разными
- PHP.ini может даже отличаться
Чтобы протестировать его в командной строке, просто откройте PowerShell или командную строку CMD и введите ту же командную строку, которую вы вводите в WTS. Вы можете увидеть некоторые результаты, которые информирует вас о проблеме.
Загляните в свой файл php_errors.log, чтобы узнать, почему не удалось запустить экземпляр планировщика задач.
Если вы не можете заставить скрипт работать в режиме командной строки и должны запустить его в веб-режиме, вы можете запустить веб-скрипт с помощью wget
, curl
или аналогичный, или даже с использованием параметров командной строки Internet Explorer.
Или используйте http://SetCronJob.com или аналогичная услуга.
Здесь есть много вариантов - "лучший", на мой взгляд, самый простой (ПОЦЕЛУЙ принсипи): запуск PHP в командной строке напрямую. Меньше ошибок, вы загружаете Apache не только для загрузки PHP (огромная трата времени), вы не полагаетесь на сетевое подключение, вы не полагаетесь на сторонние (платные) веб-сервисы, вы не рискуете тем, что IE будет обновлен! WTS также надежен (во всяком случае, на Windows Server).
Возможно, вы захотите попробовать создать задачу с помощью утилиты schtasks
для создания задания Windows cron с помощью cmd или powershell (https://msdn.microsoft.com/en-us/library/windows/desktop/bb736357 (v=против 85).aspx). Вот пример, который создаст задачу с именем task_name, выполняемую каждые 5 минут:
schtasks /Create /TN task_name /SC /MO 5 c:\php\php.exe d:\path\to\php_script.php
Файл *.bat сделал свое дело. и запускаю его через планировщик задач. Изначально у меня был файл bat, указывающий на неправильный каталог, поэтому некоторые функции не работали. Мой следующий шаг - очистить свой код и украсить почту с помощью base64 и html.
php C:\Apache_Directory\htdocs\my_phpscript.php
Мой Сценарий... И да, я знаю, что он не очень чистый/идеальный, у него все еще много работы, но сейчас он делает то, что мне нужно:
<?php
$sql1 = "USE database_name";
$sql2 = "TRUNCATE TABLE my_table";
$sql3 = "LOAD DATA LOCAL INFILE 'DataImport//import_file.csv'
REPLACE INTO TABLE my_table
CHARACTER SET latin1
FIELDS TERMINATED BY ','
IGNORE 1 LINES
(`record_number`
, `module_name`
, `action_date`
, `location`
, `type_of_outlet`
, `user_name`
, `store_code`
, `outlet_name`
, `line_question`
, `line_field_id`
, `line_value`
, `brand_code`
, `brand`);";
/* $sql4 = "SELECT COUNT(creation_time) FROM my_table
WHERE DATE(creation_time) = DATE_SUB(CURRENT_DATE(), INTERVAL 0 DAY)"; */
$con=mysqli_connect("localhost","root","mysqlpassword","database");
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
};
$result1 = mysqli_query($con, $sql1);
$result2 = mysqli_query($con, $sql2);
$result3 = mysqli_query($con, $sql3);
if (mysqli_affected_rows($con) > 1) {
$message ="". mysqli_affected_rows($con). " rows were successfully added to the my_table table!";
} else {
$message = "" . mysqli_error($con). "has caused the update to fail";
};
echo $message;
// To send HTML mail, the Content-type header must be set
require("PHPMailerAutoload.php"); // path to the PHPMailerAutoload.php file.
require("class.phpmailer.php");
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
// Additional headers
$headers .= 'To: Name1 <[email protected]>, Name2<[email protected]>' . "\r\n";
$headers .= 'From: Report Server <[email protected]>' . "\r\n";
$subject = 'Data Import Resultt' ."\r\n";
$mail = new PHPMailer();
$mail->IsSMTP(true);
$mail->Mailer = "smtp";
$mail->Host = "smtp.host.co.za";
$mail->Port = 587; // 8025, 587 and 25 can also be used. Use Port 465 for SSL.
$mail->SMTPAuth = true;
$mail->SMTPSecure = 'tls';
$mail->Username = "[email protected]";
$mail->Password = "password";
$mail->CharSet = "UTF-8";
$mail->SMTPOptions = array( // Bypass security verification on e-mail. WARNING: When using this method,
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
$mail->From = '[email protected]';
$mail->FromName = 'Reports Server';
$mail->AddAddress('[email protected]', 'Name1');
$mail->AddAddress('[email protected]', 'Name2');
$mail->AddAddress('[email protected]', 'Name3');
$mail->Subject = $subject;
$mail->Body = $message."\r\n";
$mail->WordWrap = 50;
if(!$mail->Send()) {
echo 'Message was not sent.';
echo 'Mailer error: ' . $mail->ErrorInfo;
exit;
} else {
echo 'Message has been sent.';
}
mysqli_close($con);
?>