Автоматизировать PHP-скрипт


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

Как я могу добавить этот файл для ежедневного запуска в определенный день на сервере без "человеческого" взаимодействия.

Я попробовал некоторые другие решения, такие как: Запуск PHP в расписании задач, а затем его запуск с аргументом - f C:\Apache24\htdocs\my_phpfile.php

Однако это, похоже, не привело к запуску PHP-файла, потому что при просмотре информации в таблице он не обновлялся. Я знаю, что PHP-файл работает, так как я запустил его вручную через браузер.

Пожалуйста, не мог бы я получить какой-нибудь совет/помощь? Каков наилучший способ сделать это?

В настоящее время я тестирую среду на своем ноутбуке с Windows 10, но в конечном итоге это будет работать на сервере Windows 2012.

Спасибо.

Author: Leon Claassen, 2016-07-28

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).

 2
Author: scipilot, 2016-07-28 11:30:13

Возможно, вы захотите попробовать создать задачу с помощью утилиты 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
 2
Author: Aleksey Ratnikov, 2016-07-28 11:32:07

Файл *.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); 

?>
 0
Author: Leon Claassen, 2016-07-29 06:22:55