MySql Event Scheduler Aufrufen, PHP Script
Ich bin Herumspielen mit MySql Events für die erste Zeit. Hier ist die Veranstaltung...
DELIMITER $$
CREATE EVENT testEvent
ON SCHEDULE EVERY 1 minute STARTS '2014-01-01 03:00:00'
DO BEGIN
/*
INSERT INTO test(text) VALUES ('text');* <- THIS WORKS JUST FINE
*/
SET @exec_var = sys_exec('c:\wamp\bin\php\php5.4.12\php c:\mySite\testit.php');
END $$
DELIMITER;
Den sys_exec()
Aufruf von php scheint nicht zu funktionieren und ich kann nicht herausfinden, warum. Es gibt nicht viel auf dem internet über diese. Ich weiß, das php-Skript funktioniert, weil wenn ich c:\wamp\bin\php\php5.4.12\php c:\mySite\testit.php
auf der Kommandozeile bekomme ich die Ergebnisse. testit.php nur macht das exakt gleiche einfügen, das ist auskommentiert in der Veranstaltung. Irgendwelche Ideen, warum sys_exec()
ist nicht mit meinem script? Oder wenn Fehler vorhanden sind, wie würde ich mich über die Anmeldung oder die Anzeige?
(Ich weiß, es gibt wohl Sicherheitsbedenken und andere Dinge, die ich noch nicht gedacht haben. Dies ist nur bei der ersten proof-of-concept-Sachen. Aber wenn Sie sehen keine Grund, warum ich sollte nicht gehen diesen Weg und verwenden Sie einen PHP-daemon stattdessen würde mich interessieren Gründe, warum. Dieser Weg scheint nur, wie es wäre viel einfacher, aufzustehen und zu laufen, als zu lernen/Aufbau eines PHP-daemon.)
Dank!
Dies ist alles, was in der testit.php
script...
try
{
$dbh = new PDO("mysql:host=********;dbname=********", ********, ********);
$dbh->setAttribute( PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true );
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
}
catch(PDOException $e) { echo $e->getMessage(); }
$q1 = $dbh->prepare("INSERT INTO test(text) VALUES ('text')");
$q1->execute();
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies nicht tun. MySQL-Veranstaltungen wie alle anderen Arten von gespeicherten Routinen (Trigger, Funktionen und Prozeduren) sind nicht gedacht, um verwendet werden, um den Aufruf von externen Prozessen. Stattdessen springende Punkt der gespeicherten Routinen ist im halten der db-Verarbeitung kompartimentierten von der Außenwelt.
Und auch wenn man technisch tun, es bedeutet nicht, dass es die richtige Sache zu tun. Dein Beispiel-code ist eine gute illustration, dass es absolut sinnlos. Starten Sie eine php nur um eine Verbindung zurück zu der Datenbank und eine Zeile einfügen, die Sie getan haben, einfach nur die Erteilung einfügen in das Ereignis selbst.
Wenn Sie eine Notwendigkeit, in regelmäßigen Abständen ein php-Skript verwenden speziell entwickeltes Werkzeug für die - OS-scheduler
cron
oder in deinem Fall der Windows Task Scheduler.Wenn auf der anderen Seite alle Ihre Skript tut, ist die Manipulation von Daten in Ihrer Datenbank und benötigt keine Interaktion mit Betriebssystem anders als durch bauen es Aussagen (wie
LOAD DATA
oderSELECT INTO OUTFILE
) nur tun Sie es richtig in Ihrem Fall.Neben dem Einsatz von
sys_exec
UDF ist ein riesiges Sicherheitsrisiko für Ihre DB-instance! Falls du es nicht gelesen oder vergessen, ist es hier Eine Anmerkung von Vorsicht aus einer Bibliothek, DokumentationDROP FUNCTION IF EXISTS sys_exec;
wenn Sie installiert alle Funktionen vonlib_mysqludf_sys
dann fallen Sie auch. Nach, dass löschen der plugin-Bibliotheklib_mysqludf_sys.so
oder auf windowslib_mysqludf_sys.dll
.