2016-07-28 114 views
3

作爲數據導入的一部分,我創建了一個運行在web服務器/本地主機上的PHP文件,以便將數據從CSV源文件輸入到數據庫中。問題是這個頁面需要手動打開,所以本質上就像在後面運行實際的MySQL腳本一樣。自動化PHP腳本

如何添加此文件在服務器上每天的特定日期運行,而無需「人員」交互。

我嘗試了一些其他的解決方案,如:在任務程序器 開始PHP,然後用參數 -fÇ運行它:\ 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,也許你可以在Windows?用AT命令 –

回答

2

您可以運行任務計劃程序中的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的命令行選項來使用該腳本。

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

這裏有很多選項 - 我腦海中的「最好」是最簡單的(KISS principe):直接在CLI中運行PHP。出現問題的可能性更小,您不是僅僅爲了加載PHP而引導Apache(這是一個巨大的浪費),您不依賴於網絡連接,您不依賴於第三方(付費)網絡服務,而是沒有更新IE的風險! WTS也是可靠的(無論在Windows Server上)。

+0

感謝你們......你推薦哪種方法最多,稱之爲「穩定」解決方案,因爲缺乏更好的術語?我已經設法讓它運行一個* .bat文件,然後它返回了預期的結果。 –

+0

查看更新的答案。是包裝在一個.bat是常見的做法。它有助於封裝命令行以實現可移植性,例如可以將第一張CD放入正確的位置。然後你只需要撥打蝙蝠,在WTS中沒有參數(我發現它的界面很容易找到路徑和參數!)。 – scipilot

+0

我的.bat文件運行良好。我現在添加了一個郵件功能,爲了驗證目的,必須稍微修改一下PHPMailer。但是我又一次遇到了同樣的問題。 如果我使用Web界面,即郵件,郵件只會被髮送。但是在運行bat文件時不發送郵件。但是,數據已更新。 –

2

您可能想嘗試使用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 
+0

這是'at'的替代品嗎? – scipilot

+0

@scipilot我想'schtasks'被設計爲'at'的替代品 - 它具有更多改進的語法和功能,包括靈活的任務調度。 –

0

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

?>