2016-07-28 8 views
3

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

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

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

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

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

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

Спасибо.

+1

Пользователь FreeBSD/Linux здесь. Не знаю о Windows, и я понятия не имею, как кодируется ваш PHP, но ваш подход правильный, если вы можете запустить PHP из командной строки. Альтернативно, если вы можете «вызвать» веб-страницу из командной строки, используя что-то вроде 'curl',' wget' или 'fetch', тогда вы можете запланировать эту команду. – Tigger

+0

в unix-системах вы можете делать cronjobs, может быть, вы можете также в окнах? с командой AT –

ответ

2

Вы можете запускать скрипты в планировщике заданий (я делаю это много), но быть в курсе следующих моментов:

Вы запустить его как php C:\Apache24\htdocs\my_phpfile.php

PHP должен быть в вашем PATH, иначе вы будете необходимо проложить прямо к нему:

c:\php\php C:\Apache24\htdocs\my_phpfile.php 

Запуск так, как будто это работает в режиме CLI, а не в Интернете. Когда вы нажимаете скрипт в Apache, среда отличается от CLI. Возможно, ваш сценарий не работает, как вы ожидаете, из-за различий в среде. , например.

  • ток-каталог отличается,
  • нет $ _SERVER переменные,
  • за $ _ENV будет отличаться,
  • нет .htaccess,
  • пользователь будет отличаться и, следовательно, разрешения доступа к файлу
  • загруженные модули могут быть разными
  • Возможно, PHP.ini может быть другим

Чтобы проверить его на CLI, просто откройте окно PowerShell или CMD и введите ту же командную строку, которую вы вводите в WTS. Вы можете увидеть некоторые результаты, которые сообщают вам о проблеме.

Просмотрите свой php_errors.log, чтобы узнать, почему не удалось запустить экземпляр запуска Task-Scheduler.

Если вы не можете заставить сценарий работать в режиме CLI и запустить его в режиме Web, вы можете нажать на веб-скрипт, используя wget, curl или аналогичные, или даже используя параметры командной строки в Internet Explorer.

Или используйте http://SetCronJob.com или аналогичный сервис.

Здесь есть много вариантов - «лучший» в моем сознании - самый простой (принцип KISS): работает PHP в CLI напрямую. Есть меньше ошибок, вы не загружаете Apache только для загрузки PHP (огромные отходы), вы не полагаетесь на сетевое подключение, вы не полагаетесь на сторонние (платные) веб-службы, вы не подвергая опасности обновление IE! WTS также надежна (на любом Windows Server).

+0

Спасибо за это ... Какой метод вы бы рекомендовали как наиболее, назовите его «стабильным» решением из-за отсутствия лучшего термина? Мне действительно удалось запустить его файл * .bat, а затем он вернул ожидаемые результаты. –

+0

См. Обновленный ответ. Да, упаковка в байте - обычная практика. Он помогает инкапсулировать командную строку для переносимости и может, например, сделать первый компакт-диск в нужном месте. Тогда вам просто нужно позвонить в летучую мышь, без параметров в WTS (я нахожу, что это интерфейс неудобно для путей и параметров!). – scipilot

+0

Мой .bat файл работает отлично. Теперь я добавил функцию почты, и мне пришлось немного взломать PHPMailer для целей аутентификации. Но опять же я испытываю те же проблемы, что и вначале. Письмо отправляется только в том случае, если я использую веб-интерфейс, т. Е. Хром. но при запуске файла bat письмо не отправляется. Однако данные обновляются. –

2

Возможно, вы захотите создать задачу с помощью утилиты schtasks для создания задания cron для Windows с помощью cmd или powershell (https://msdn.microsoft.com/en-us/library/windows/desktop/bb736357(v=vs.85).aspx). Вот пример, который будет создавать задачи с именем task_name работает через каждые 5 минут:

schtasks /Create /TN task_name /SC /MO 5 c:\php\php.exe d:\path\to\php_script.php 
+0

Является ли это заменой 'at'? – scipilot

+0

@scipilot Я полагаю, что 'schtasks' был разработан как замена для' at' - он имеет более улучшенный синтаксис и полномочия, включая гибкое расписание для задачи. –

0

The * .bat файл сделал трюк. и выталкивает его с помощью планировщика заданий. Первоначально у меня был файл bat, указывающий на неправильный каталог, поэтому некоторые функции не работали. Мой следующий шаг - очистить мой код и украсить почту с помощью base64 и html.

php C:\Apache_Directory\htdocs\my_phpscript.php 

My Script ... И да, я знаю, что это не очень чистый/совершенна, она до сих пор много работы, но сейчас это делать то, что мне нужно это сделать:

<?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); 

?>