Zeitversetzte "Aktion"

Okay, also das PHP Script verstehe ich soweit.
Der Grund, warum in der Schleife nicht mit SQL-Statements gearbeitet wird ist sicherlich die Performance oder?
Oder warum arbeitet man dort mit prepared Statements?

Und wie genau säh das Logging aus? Ist das ne einfache Echoausgabe? Und durch den Scriptaufruf wird das in die Log-Datei geschrieben? Oder nehme ich dort auch einfach fopen/fwrite?

Das Startscript muss ich mir nochmal genauer anschauen und verstehen. z.B. was genau ich da noch an passen muss.. ;-)

Aber die Richtung gefällt mir sehr ;-) Danke!

paD
 
Prepared Statements:

Genau aus Performance-Gründen würde ich das verwenden. Und weil es einfach übersichtlichen Code bedeutet. Sieht auf den ersten Blick sehr viel angenehmer aus, als die ganzen prozeduralen Ansätze mit mysql(i)-Funktionen.


Logging:

Hier eine Logger-Klasse, die ich mal geschrieben habe:

PHP:
<?php
class Logger
{
	/**
	 * Log file to write to
	 * @var string
	 */
	private $_logfile = "./app.log";
	
	/**
	 * Timezone to use
	 * @var string
	 */
	private $_timezone = 'Europe/Berlin';

	/**
	 * File descriptor handle
	 * @var handle
	 */
	private $_fd = null;
	
	/**
	 * Logger instance for singleton pattern
	 * @var Logger
	 */
	private static $_inst = null;

	/**
	 * Create a new Logger instance
	 */
	private function __construct()
	{
		date_default_timezone_set($this->_timezone);
		
		if(!$this->_fd)
		{
			$this->_fd = @fopen($this->_logfile, "a");
		}
    
		if(!$this->_fd)
		{
			throw new Exception('Could not append to log!');
		}
	}

	/**
	 * Append a log line
	 * 
	 * @param string $line
	 * @return void
	 */
	public static function log($line)
	{
		if(self::$_inst === null)
		  self::$_inst = new Logger();
		  
		if($line instanceof Exception)
		{
		  $line = $line->getMessage();
		}
		
		$date = date('Ymd-H:i:s');
    
		fwrite(self::$_inst->_fd, "$date\t$line\n");
	}
	
	/**
	 * Destroy the Logger instance
	 */
	public function __destruct()
	{
		if($this->_fd)
		  fclose($this->_fd);
	}
}
?>
 
Okay, soweit bin ich gekommen..
Aber das mit dem Start / Stop-Script check ich nicht :mad:
Das funktioniert nicht..

Das PHP Script allerdings funktioniert prima, danke :)

paD
 
Okay, ich box mich da mal durch, das PHP script ist allerdings das wesentlich interessantere..

Ich hätte noch eine, hoffentlich letzte Frage:

PHP:
$auftraege_statements = $db->prepare("SELECT * FROM auftraege WHERE auftraege_erledigt = 0 AND auftraege_zeit < ?");
while(true)
{
  try
  {
	$auftraege_statements->bindValue(1, time());
...

Oder mach ich besser ne IF
PHP:
$auftraege_statements = $db->prepare("SELECT * FROM auftraege WHERE auftraege_erledigt = 0");
 
while(true)
{
  try
  {
    $auftraege_statements->execute();
    while($auftraege = $auftraege_statements->fetchObject())
    {
      if($auftraege->zeit < time()) { 
AUFTRAG ABABREITEN

.. was ist besser? ;)
 
Ich würde die zweite Variante wählen. Und es hat einen Grund: Wenn du ein solches Query absetzt, bei Millionen Datensätze durchsucht werden müssen, macht es Sinn, auf die Spalte, die in der WHERE-Condition behandelt wird, einen Index zu legen, da dadurch die Suche schneller wird.

Je weniger Spalten Indizes haben, um so schneller wird ein neuer Eintrag in die Datenbank geschrieben.

Es ist allso ein Hin und Her zwischen den beiden Zuständen "Schnelle Suche" und "Schneller Insert".

Lege einen Index auf die Spalte auftraege_erledigt und benutz den zweiten Fall.

Wenn du es mit dem ersten machen willst, solltest du auf auftraege_erledigt und auf auftraege_zeit einen Index legen. Das jedoch ist sehr unvorteilhaft für INSERTs.
 
Okay, hatte mir fast gedacht, dass weniger DB mehr, Berechnung besser ist :)

Rufe ich die Datei mit PHP auf, also im Browser oder über php auftraege.php funktioniert das soweit.
Über ./auftraege.php also bash, bekomm ich immer:


[root@...]#aufgaben.php
aufgaben.php: line 1: syntax error near unexpected token `('
aufgaben.php: line 1: `$db = new PDO('mysql:dbname=busaku;host=127.0.0.1', 'usr', 'pw');'

Ich verzweifel hier noch :D

paD
 
Ok, es könnte sein, dass dein PHP die Option -r nicht unterstützt. In diesem Falle müsstest du die PHP-Tags verwenden <?php und ?> in der 2 Zeile bzw. am Ende.

Ähm, außerdem: Hast du evtl. 2 PHP-Versionen installiert? Die eine PHP4 und die andere PHP5? PDO wird erst seit PHP 5.1 verfügbar. Für PHP 5.0 müsste man die PECL-Extension installieren.

EDIT 2:
Wenn du PHP in zwei Versionen installiert hat, könnte es sein, das es eine Binary /usr/bin/php5 gibt. Wenn das der Fall ist, müsstest du dein Script anpassen und in der ersten Zeile den Shebang zu folgender Zeile ändern:

Code:
#!/usr/bin/php5 -r
 
Zuletzt bearbeitet:
Hmpf..
Hatte gemerkt, dass ich ein Fehler habe hatte das #!/usr/bin/php -r am Anfang nicht drinne.
Habe ich das drinne, bekomme ich gleich den Fehler, dass

PHP Parse error: syntax error, unexpected '/' in Command line code on line 1

Egal, ob mit -r oder ohne. Liegt es daran, dass irgendwas nicht installiert ist..?

#!/usr/bin/php5 -r
GIbt mit ein /usr/bin/php5: bad interpreter: aus

Installiert ist PHP5..

paD
 
Zuletzt bearbeitet:
Tada, habs!
Es war wohl eine Kombination von Fehlenden rechten der Datei, -r und dem falschen Interpreter-Pfad.

Okay, den Rest schaffe ich wohl alleine :-)
Tausend Dank nochmal!

paD
 
Zurück