2016-07-28 41 views
3

Als Teil eines Datenimports habe ich eine PHP-Datei erstellt, die auf einem Webserver/localhost ausgeführt wird, um Daten aus einer CSV-Quelldatei in eine Datenbank einzugeben. Das Problem ist, dass diese Seite manuell geöffnet werden muss, so dass im Wesentlichen das tatsächliche MySQL-Skript dahinter läuft.PHP-Skript automatisieren

Wie kann ich diese Datei hinzufügen, um an einem bestimmten Tag jeden Tag auf dem Server ohne "Mensch" Interaktion zu laufen.

ich einige der anderen Lösungen versucht, wie zum Beispiel: Ab PHP im Task Schedular und es dann mit dem Argument -f C ausgeführt wird: \ Apache24 \ htdocs \ my_phpfile.php

Doch dies schien nicht um die PHP-Datei auszuführen, weil die Informationen in der Tabelle nicht aktualisiert wurden. Ich weiß, dass die PHP-Datei funktioniert, da ich diese manuell über einen Browser ausgeführt habe.

Bitte könnte ich einen Rat/Hilfe bekommen? Was ist der beste Weg, dies zu tun?

Ich teste derzeit die Umgebung auf meinem Windows 10 Laptop, aber letztlich wird dies auf einem Windows 2012 Server ausgeführt werden.

Danke.

Sie führen es als php C:\Apache24\htdocs\my_phpfile.php

PHP müssen in Ihrem PATH sein, sonst werden Sie:

+1

FreeBSD/Linux Benutzer hier. Keine Ahnung von Windows und ich habe keine Ahnung davon, wie PHP codiert ist, aber Ihre Vorgehensweise ist korrekt, wenn Sie PHP über die Befehlszeile ausführen können. Alternativ können Sie, wenn Sie eine Webseite von der Kommandozeile aus "curl", "wget" oder "fetch" aufrufen können, stattdessen diesen Befehl einplanen. – Tigger

+0

in Unix-Systemen können Sie Cronjobs tun, vielleicht können Sie auch in Windows? mit AT-Befehl –

Antwort

2

Sie können PHP-Skripte im Taskplaner (ich mache es viel), aber beachten Sie die folgenden Punkte laufen muss direkt zu ihm führen:

So läuft es läuft CLI-Modus, nicht Web. Wenn Sie das Skript in Apache drücken, unterscheidet sich die Umgebung stark von CLI. Ihr Skript wird möglicherweise aufgrund der unterschiedlichen Umgebung nicht wie erwartet ausgeführt. z.B.

  • die Strom-Verzeichnis ist anders,
  • gibt es keine $ _SERVER Variablen,
  • die $ _ENV anders sein wird,
  • es keine .htaccess ist,
  • der Benutzer anders sein und daher die Dateizugriffsberechtigungen
  • die geladenen Module möglicherweise
  • die PHP.ini kann auch anders sein

Um es in CLI zu testen, öffnen Sie einfach eine PowerShell- oder eine CMD-Eingabeaufforderung und geben Sie dieselbe Befehlszeile ein, die Sie in WTS eingeben. Möglicherweise sehen Sie eine Ausgabe, die Sie über das Problem informiert.

Schauen Sie in Ihrer php_errors.log nach, warum die Task-Scheduler-Instanz fehlgeschlagen ist.

Wenn Sie das Skript nicht im CLI-Modus ausführen können und es im Webmodus ausführen müssen, können Sie das Webskript mit wget, curl oder ähnlichem aufrufen oder sogar die Befehlszeilenoptionen von Internet Explorer verwenden.

Oder verwenden Sie http://SetCronJob.com oder einen ähnlichen Dienst.

Es gibt viele Optionen hier - die "besten" in meinem Kopf ist die einfachste (KISS principe): läuft PHP in CLI direkt. Es gibt weniger zu schief gehen, Sie sind nicht Apache nur zum Laden von PHP (eine massive Verschwendung), Sie sind nicht auf eine Netzwerkverbindung angewiesen, Sie sind nicht auf 3rd Party (kostenpflichtige) Web-Services, du bist nicht gefährdet, dass IE aktualisiert wird! WTS ist auch zuverlässig (auf Windows Server sowieso).

+0

Danke dafür ... Welche Methode würden Sie am besten empfehlen, nennen Sie es "stabile" Lösung für das Fehlen eines besseren Begriffes? Ich habe tatsächlich geschafft, es eine * .bat-Datei laufen zu lassen und dann gab es die erwarteten Ergebnisse zurück. –

+0

Siehe aktualisierte Antwort. Ja, das Einwickeln in ein .bat ist üblich. Es hilft, die Befehlszeile für Portabilität zu kapseln, und könnte beispielsweise CD an der richtigen Stelle zum Beispiel. Dann müssen Sie nur den Schläger rufen, ohne Params in WTS (ich finde es Interface fiddly für Pfade und Parameter!). – scipilot

+0

Meine .bat-Datei funktioniert gut. Ich habe jetzt eine Mail-Funktion hinzugefügt und musste den PHPMailer ein wenig für Authentifizierungszwecke hacken. Aber wieder habe ich die gleichen Probleme wie anfangs. Die E-Mail wird nur gesendet, wenn ich die Web-Oberfläche, d. H. Chrom verwenden. Aber wenn die Bat-Datei ausgeführt wird, wird die Mail nicht gesendet. Die Daten werden jedoch aktualisiert. –

2

Sie können versuchen, Task mit schtasks Dienstprogramm erstellen, um Windows Cron-Auftrag mit Cmd oder Powershell (https://msdn.microsoft.com/en-us/library/windows/desktop/bb736357(v=vs.85).aspx) zu erstellen. Hier ist beispielsweise die Aufgabe mit dem Namen task_name laufen alle 5 Minuten schaffen:

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

Ist dies ein Ersatz für 'at'? – scipilot

+0

@scipilot Ich nehme an, dass 'schtasks' als Ersatz für' at' entworfen wurde - es hat eine verbesserte Syntax und Fähigkeiten, einschließlich eines flexiblen Zeitplans für die Aufgabe. –

0

Die * .bat Datei hat den Trick. und Kick-off es durch den Taskplaner. Anfangs hatte ich die bat-Datei auf das falsche Verzeichnis verwiesen, weshalb einige Funktionen nicht funktionierten. Mein nächster Schritt ist, meinen Code zu säubern und die Mail mit base64 und html zu verschönern.

php C:\Apache_Directory\htdocs\my_phpscript.php 

My Script ... Und ja, ich weiß, es ist nicht sehr sauber/perfekt ist, hat es noch eine Menge Arbeit, aber jetzt es tut, was ich es tun muss:

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

?>