php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 08.10.2007, 15:04  
there's only one psycho
 
Benutzerbild von PsychoEagle
 
Registriert seit: 21.08.2007
Beiträge: 1.283
PHP-Kenntnisse:
Anfänger
PsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer Mensch
PsychoEagle eine Nachricht über ICQ schicken PsychoEagle eine Nachricht über Skype™ schicken
Standard Komisches Verhalten bei schreiben in/von Datei

Hi ihr

ich hab mir eine Funktion geschrieben, die das Geschehen meines Scriptes ein wenig mitloggen soll. Das ganze wird in eine Datei geschrieben, da meine Datenbank durch das Script doch sehr beansprucht wird und ich so besser den Ablauf und Standpunkt kontrollieren kann (und notfalls runterladen etc).

So sieht mein Quellcode aus:

PHP-Code:
<?php
  
function controlLog($type,$str) {
      
$str '['date("Y-m-d H:i:s") .'] '$type .' -> '$str ."\r\n";
    
$filename 'conrol.log';
    
$contents '';
    if(
filesize($filename)>0) {
      if(!(
$handle fopen($filename,'r'))) {
        echo 
"<u>Fehler:</u> Die Datei [i]"$filename ."[/i] konnte nicht gefunden oder ge&ouml;ffnet werden.
\n"
;
      } else {
          
$contents fread($handlefilesize($filename));
        @
fclose ($handle);
      }
    }
    if(!(
$handle fopen($filename,'w+'))) {
      echo 
"<u>Fehler:</u> Die Datei [i]"$filename ."[/i] konnte nicht gefunden oder ge&ouml;ffnet werden.
\n"
;
    } else {
        
$contents $str $contents;
      if(!@
fwrite($handle$contents)) {
        echo 
"<u>Fehler:</u> Die Datei [i]"$filename ."[/i] kann nicht beschrieben werden.
\n"
;
      }
      @
fclose ($handle);
    }
      return 
$str;
  }
?>
Und so ruf ich diese Funktion auf:

PHP-Code:
<?php
  
foreach($data AS $tmp_database => $arr_tables) {
      
controlLog('DB',$tmp_database);
    echo 
"[b]Database: $tmp_database[/b]
\n"
;
      foreach(
$arr_tables AS $tmp_table) {
          
controlLog('Table',$tmp_table);
   
// ...
?>
Jetzt hab ich aber folgendes Problem, er schreibt immer nur 2-3 Zeilen in die Datei, die restlichen Daten gehen verloren. Teilweise ist auch nur eine halbe Zeile enthalten

Das steht drin (man sieht, von der letzten Zeile fehlt was)

Code:
[2007-10-08 14:56:42] Table -> einzelhandel_elektrotechnik
[2007-10-08 14:55:32] Table -> einzelhandel_chemie
[2007-10-08 14:55:32] Table -> einzelha
Ist mein Script zu schnell und wartet nicht, bis alle Daten ausgelesen sind und neu in die Datei geschrieben wurden (+ dem neuen Eintrag am Anfang)?

Ist es zu umständlich, den Inhalt auszulesen und dann alles neu einzutragen? Geht das einfacher? Fand nichts, wie ich neue Sachen an den Anfang der Datei schreiben kann, so dass das Älteste unten steht und Aktuellste oben. Nur wie ich es an das Ende anfügen kann...

Ich hoffe ich hab mich für euch verständlich ausgedrückt, hab immer so Gedankensprünge

Danke derweil

Grüße
Da Psy
__________________
"Weaseling out of things is important to learn. It's what separates us from the animals ... except the weasel." (Homer J. Simpson)
PsychoEagle ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 08.10.2007, 15:20  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Hallo,
ich würd nichtmal sagen, dass das "SQLing" langsamer als deine Dateioperationen sind.
Wenn schon würde ich die Datei auch nicht zweimal öffnen (Race Conditions), sondern einmal und das mit "a".

Siehe Modi:
http://de.php.net/fopen

Wenn du sehr viel loggst, würde es sich möglicherweise lohnen, die Daten erstmal zu sammeln und am Ende des Skripts zu speichern. Zum Beispiel über den Destructor deiner Log-Klasse oder auto_append_file.
Gabs dafür nicht sogar eine php-eigene Funktion(alität)? log() ist es schonmal nicht ..

Wenn in der Datei ein scheinbar abgeschnittener Wert steht würde ich erstmal sichergehen, dass auch wirklich kein solcher Wert als $str übergeben wird. Dazu einfach mal Debugweise den debug_backtrace() serialisiert im Log mitspeichern, vielleicht kommst du dem Verursacher dadurch näher.

Wenn du das 100% ausschließen kannst mach dich mal mit Race-Conditions vertraut, die dürften sich aber durch fopen(.., "a") egalisieren (oder?)

Abgesehen davon würde ich für die Logs kein eigenes Format "[zeit] irgendwas -> nochwas" erfinden. Wie wärs mit CSV, kannst du dein Log dann auch prima performant mit fgetcsv auslesen und anschaulich anzeigen. Will sagen, wärst damit möglicherweise etwas flexibler
Kannst das Log dann auch mal in Excel laden und nach Spalten sortieren wenn dich ein Wert interessiert. Sind so Kleinigkeiten, da stehen einem "eigene" Formate eher im Weg.
Zergling-new ist offline  
Alt 08.10.2007, 16:09  
there's only one psycho
 
Benutzerbild von PsychoEagle
 
Registriert seit: 21.08.2007
Beiträge: 1.283
PHP-Kenntnisse:
Anfänger
PsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer Mensch
PsychoEagle eine Nachricht über ICQ schicken PsychoEagle eine Nachricht über Skype™ schicken
Standard

Nunja, die Funktion dieses mitloggens hat nur die, dass ich sehe, wo gerade das Script läuft (da es doch ein wenig lange läuft, da große Datenbank).

Es läuft ca (laut meinen Berechnungen) 9 Stunden. Funktion des Scriptes, Dubletten herausfinden aus 12 Datenbanken mit durchschnittlich 90 Tabellen. Insgesamt beläuft sich das auf 13 Millionen Datensätze

Und damit ich net in die Datenbank muss und schauen muss, aus welcher Datenbank der letzte Eintrag kommt, dachte ich mir, schreib ich immer die aktuelle Datenbank und Tabelle an den Anfang einer Textdatei, die einfach mit .log endet.

Ich kann definitiv ausschliessen, dass die Variable $str nur einen Teil enthält oder eben nur den verstümmelten String.

Über Race-Conditions les ich mich mal weng ein, was das genau ist

Der Modus (mode) a ist leider nicht das, was ich brauche, da er den Zeiger an das Ende der Datei setzt, und nicht wie ich es gerne hätte, an den Anfang. Je weiter er nach unten in der Datei kommt, desto älter soll der Eintrag sein.

Jetzt fällt mir ein, eigentlich sollte es ja mit r+ funktionieren, da dieser Modus den Zeiger ja an den Anfang setzt.

Kann ich leider erst morgen früh testen.

Danke für deinen Beitrag Zergling, da werd ich gleich mal weiter werkeln morgen

Grüße
Da Psy

Edtih sagt:
Modi zu Modus verbessert
__________________
"Weaseling out of things is important to learn. It's what separates us from the animals ... except the weasel." (Homer J. Simpson)
PsychoEagle ist offline  
Alt 08.10.2007, 16:19  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Ich würde mal behaupten, bestenfalls werden die Daten überschrieben:
Zitat:
'r+' Öffnet die Datei zum Lesen und Schreiben und setzt den Dateizeiger auf den Anfang der Datei.
Und: es heißt der Modus.
nikosch ist gerade online  
Alt 08.10.2007, 18:07  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von PsychoEagle
Nunja, die Funktion dieses mitloggens hat nur die, dass ich sehe, wo gerade das Script läuft (da es doch ein wenig lange läuft, da große Datenbank).

Es läuft ca (laut meinen Berechnungen) 9 Stunden. Funktion des Scriptes, Dubletten herausfinden aus 12 Datenbanken mit durchschnittlich 90 Tabellen. Insgesamt beläuft sich das auf 13 Millionen Datensätze

Und damit ich net in die Datenbank muss und schauen muss, aus welcher Datenbank der letzte Eintrag kommt, dachte ich mir, schreib ich immer die aktuelle Datenbank und Tabelle an den Anfang einer Textdatei, die einfach mit .log endet.

Ich kann definitiv ausschliessen, dass die Variable $str nur einen Teil enthält oder eben nur den verstümmelten String.

Über Race-Conditions les ich mich mal weng ein, was das genau ist

Der Modi (mode) a ist leider nicht das, was ich brauche, da er den Zeiger an das Ende der Datei setzt, und nicht wie ich es gerne hätte, an den Anfang. Je weiter er nach unten in der Datei kommt, desto älter soll der Eintrag sein.

Jetzt fällt mir ein, eigentlich sollte es ja mit r+ funktionieren, da dieser Modi den zeiger ja an den Anfang setzt.

Kann ich leider erst morgen früh testen.

Danke für deinen Beitrag Zergling, da werd ich gleich mal weiter werkeln morgen

Grüße
Da Psy
das wird eine große log datei oder? und du willst wirklich den server zusätzlich belasten indem du die datei immer komplett in den ram liest, etwas an den anfangs fügst und das ganze wieder komplett schreibst?
naja jedem das seine, aber es ist durchweg perfomanter das ganze einfach im append (a) mode zu öffnen und dann runterzuscrollen....

zu den race-conditions: greift ein prozess auf die log datei zu, oder sinds mehrere? wenns nur einer ist, brauchst du dich darum nicht zu kümmern...

aber mal zu deinem code:

Zitat:
fwrite() gibt bei Erfolg die Anzahl der geschriebenen Bytes zurück, andernfalls FALSE.
also: (ungetestet)

PHP-Code:
$bytes_written=fwrite($handle$contents);
$strlen_contents=strlen($contents);
if(
$strlen_contents!==$bytes_written) echo "<u>Fehler:</u> Konnte ".($strlen_contents-$bytes_written)." Bytes nicht in die Datei schreiben"
gruß
brian johnson ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Hochgeladene Datei wird doppelt abgelegt thecracked PHP Tipps 2008 3 01.07.2008 16:31
Datei per Buttonklick runterladen... go1denboy PHP Tipps 2008 7 14.06.2008 20:25
Großer Baum -> Große Datei -> Hohe Ladezeit :( PsychoEagle PHP Tipps 2008 7 22.09.2007 12:44
.gz Datei entpacken und mit dem Inhalt weiterarbeiten R4v3r PHP Tipps 2007 8 02.02.2007 14:49
Komisches problem mit Datei Berechtigungen stuvomatic PHP Tipps 2006 5 28.05.2006 01:49
Datei durchsuchen Wöllchen Beitragsarchiv 3 02.03.2006 22:23
komisches Verhalten bei foreach ?! PHP Tipps 2006 5 21.01.2006 19:36
[Erledigt] Datei mit &amp;amp;amp;amp;quot;w&amp;amp;amp;amp;quot; schreiben -&amp;amp;amp;amp;gt PHP-Fortgeschrittene 17 30.12.2005 13:58
Datei auf FTP-Server ändern ohne lokal abzuspeichern faux PHP-Fortgeschrittene 11 02.09.2005 11:54
Ordner Struktur auslesen bestimmte datei finden .... silverghost PHP Tipps 2005 3 24.05.2005 13:55
komisches sql verhalten PHP Tipps 2005 2 30.04.2005 19:33
xfdf Datei mit PHP an eMail senden Problem: Leere Datei PHP Tipps 2004-2 1 07.12.2004 12:25
Datei mit php erzeugen Stümper PHP Tipps 2004 4 12.10.2004 12:51
php und ftp PHP Tipps 2004 4 07.10.2004 09:58
Komisches Verhalten PHP/MySQL Skript PHP Tipps 2004 9 01.07.2004 12:58

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php script schreibt doppelte einträge csv, php log datei schreiben lesen, fputs php berechtigung

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:09 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.