簡體   English   中英

自動化PHP腳本

[英]Automate PHP Script

作為數據導入的一部分,我創建了一個在webserver / localhost上運行的PHP文件,用於從CSV源文件將數據輸入數據庫。 問題是這個頁面需要手動打開,所以本質上就像運行它背后的實際MySQL腳本一樣。

如何在沒有“人”交互的情況下,每天在服務器上添加此文件以在特定日期運行。

我嘗試了一些其他解決方案,例如:在Task Schedular中啟動PHP,然后使用參數-f C:\\ Apache24 \\ htdocs \\ my_phpfile.php運行它

但是,這似乎沒有執行PHP文件,因為在查看表中的信息時它沒有更新。 我知道PHP文件有效,因為我通過瀏覽器手動運行它。

我可以得到一些建議/幫助嗎? 做這個的最好方式是什么?

我目前正在我的Windows 10筆記本電腦上測試環境,但最終這將在Windows 2012 Server上運行。

謝謝。

你可以在任務計划程序中運行php腳本(我做了很多),但要注意以下幾點:

你運行它作為php C:\\Apache24\\htdocs\\my_phpfile.php

PHP必須在你的PATH中,否則你需要直接路徑到它:

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

像這樣運行它運行CLI模式,而不是Web。 當您點擊Apache中的腳本時,環境與CLI完全不同。 由於環境不同,您的腳本可能無法按預期運行。 例如

  • 當前目錄不同,
  • 沒有$ _SERVER變量,
  • $ _ENV會有所不同,
  • 沒有.htaccess,
  • 用戶將是不同的,因此文件訪問權限
  • 加載的模塊可能不同
  • PHP.ini可能會有所不同

要在CLI中對其進行測試,只需打開PowerShell或CMD提示符,然后輸入您在WTS中添加的命令行。 您可能會看到一些輸出通知您問題。

查看php_errors.log以查看Task-Scheduler運行實例失敗的原因。

如果您無法使腳本在CLI模式下運行並且必須在Web模式下運行,則可以使用wgetcurl或類似命令,甚至使用Internet Explorer的命令行選項來訪問Web腳本。

或使用http://SetCronJob.com或類似服務。

這里有很多選項 - 我認為“最好的”是最簡單的(KISS原則): 直接在CLI中運行PHP 不會出錯,你不是為了加載PHP而引導Apache(一個巨大的浪費),你不依賴於網絡連接,你不依賴於第三方(付費)網絡服務,你是沒有IE更新的風險! WTS也很可靠(無論如何都在Windows Server上)。

您可能想嘗試使用schtasks實用程序創建任務以使用cmd或powershell創建Windows cron作業( 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

* .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 <name1@domain.co.za>, Name2<name2@domain.co.za>' . "\r\n";
$headers .= 'From: Report Server <ReportServer@domain.co.za>' . "\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 = "username@domain.co.za";
   $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     = 'reportserver@domain.co.za';
   $mail->FromName = 'Reports Server';
   $mail->AddAddress('name1@domain.co.za', 'Name1');
   $mail->AddAddress('name2@domain.co.za', 'Name2');
   $mail->AddAddress('name3@domain.co.za', '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); 

?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM