php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 02.04.2007, 16:13  
Erfahrener Benutzer
 
Registriert seit: 17.01.2006
Beiträge: 468
Slava
Standard eof setzen.

ich vermisse (bzw kenne nicht) bei Dateibearbeitung eine Möglichkeit an einer bestimmter stelle EOF(end of file) zu setzen.

szenario:
ich möchte die letzte 100 byte bei einer 30mb datei abschneiden.

dafür muss ich die ganze datei komplet von anfang an bis zur filesize()-100 in eine andere datei schreiben und einschliesslich diese datei umbenennen um die schon vorhandene überschreiben.
so eine vorgehensweise ist unefizient.

optimal wäre in diesem fall einfach EOF an Position filesize()-100 zu setzen aber so eine möglichkeit kenne ich leider nicht.

ich freue mich auf jeder Vorschlag
__________________
Slava
http://bituniverse.com
Slava ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 02.04.2007, 16:22  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Slava,

ich kenne den Anwendungsfall nicht genau, aber für mich hört sich das eher wie ein "error by design" an mit einer 30MB großen Datei operieren zu müssen.

Sollte das wirklich notwenig sein, kannst du dir mal die Codes für EOF ansehen und diese Binär-Werte manuall in die Datei schreiben. Andere Idee ist die Dateien mit fread() (=binary save) von 0 bis filesize - 100 einzulesen. Das sollte recht effizient funktionieren.

Siehe auch http://de3.php.net/manual/en/function.fread.php.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 02.04.2007, 17:43  
Erfahrener Benutzer
 
Registriert seit: 05.07.2004
Beiträge: 1.476
DiBo33
Standard

http://de.php.net/manual/de/function.ftruncate.php
DiBo33 ist offline  
Alt 02.04.2007, 17:51  
Erfahrener Benutzer
 
Registriert seit: 17.01.2006
Beiträge: 468
Slava
Standard

warum denn error by design?
was spricht gegen 30mb dateien, wenn ich geziehlt ein wert an position X mit länge Y auslese?
funktioniert eigentlich schneller als zugriff auf db bei überförderten DB-Server.
Die andere idee mit fread benutze ich schon( habe ich eigentlich oben beschrieben) setze aber buffer mit stream_set_write_buffer ein wenig grösser.

wenn es keine direkte möglichkeit gibt eof zu setzen, dann werde ich natürlich das weiter machen. nur finde ich eben diese methode nicht unbedingt als die beste.
__________________
Slava
http://bituniverse.com
Slava ist offline  
Alt 02.04.2007, 18:21  
Erfahrener Benutzer
 
Registriert seit: 17.01.2006
Beiträge: 468
Slava
Standard

Zitat:
Zitat von DiBo33
http://de.php.net/manual/de/function.ftruncate.php
Mein Gott
ich programmiere seit 5 Jahre php und habe einfach diese funktion nie gebraucht.
Ja natürlich ist das die Lösung
PHP-Code:
$datei="a.txt";
$abschnitt=5;//5 zeichen abschneiden
$fp=fopen("a.txt","rb+");
fseek($fp,$abschnitt*-1,SEEK_END);
ftruncate($fp,$abschnitt);
fclose($fp); 
vielen Dank DiBo33


edit:
es ist besser mit modifer "a" datei zu öfnen, dann kann man fseek sparen
PHP-Code:
$datei="a.txt";
$abschnitt=5;//5 zeichen abschneiden
$truncpos=(int)filesize($datei)-$abschnitt;
$fp=fopen("a.txt","a");
ftruncate($fp,$truncpos);
fclose($fp);
echo 
filesize("a.txt"); 
__________________
Slava
http://bituniverse.com
Slava ist offline  
Alt 02.04.2007, 19:23  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von Slava
warum denn error by design?
Weil ich nicht ganz verstehe, warum du das machst. Sind das Cache-Dateien, oder Daten-Dateien, ...? In der Regel verwendet man eine DB und um diese nicht zu stressen Statement-Caching.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 02.04.2007, 20:21  
Erfahrener Benutzer
 
Registriert seit: 17.01.2006
Beiträge: 468
Slava
Standard

ich verwende für Cache eine datei, die aus mehreren cache-abschnitten besteht.
bei einem ordnder , der aus mehreren cache-dateien besteht( etwa 1000) ist die suche von einer datei manchmal langsammer als in einer datei.
mein content wird durch die content-id gesteuert. ich generiere bei veränderung von content ein eine grosse datei wo die Inhalte von allen ausgaben eine nach dem anderem reingeschrieben werden.
werend Screibvorgang wird in eine index-datei die position und die länge von dem aktuelem content reingeschrieben und zwar genau an der position=content_id*30;

wenn der besucher ein seite mit content_id= 400 aufruft, dann öfne ich einfach meine indexdatei setze zeiger auf 400*30 und lese die position X und die länge von dem content Y.
dann bleibt nur die andere datei mit content aufmachen und ab der position X die ich eben in index-datei ausgelesen habe Y zeichen auszugeben.
__________________
Slava
http://bituniverse.com
Slava ist offline  
Alt 02.04.2007, 20:31  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Slava,

also doch "error by design". Sowas würde ich nur machen, wenn mich jemand mit einer Knarre in der Hand zwingt. Cache doch besser nach ID, sprich eine Datei für jede ID. Somit musst du nicht in einer Datei scannen, sondern kannst recht unkompliziert einfach auf die Datei zugreifen.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 02.04.2007, 21:18  
Erfahrener Benutzer
 
Registriert seit: 17.01.2006
Beiträge: 468
Slava
Standard

warum einfach, wenn es auch schwierig geht?
ich sage doch, dass bei mehreren dateien (mehr als 1000)im einem ordner dauert fopen(dateiname$id) manchmal langsamer als bei einem ordner mit 2 dateien.
bei guter mysql-verbindung lohnt sich einfach chachen von mehreren dateien nicht mehr, da es einfach in vergleich zu mysql-abfrage viel zu lange dauert.
Meine Lösung ist als notlösung vogesehen, wenn mysql-verbindug nicht so gut ist und mehrere dateien bei cachen erzeugt werden müssen.
die genaue grenze ist von OS und anderen faktoren abhängig, also kann ich dir nicht direkt sagen, dass bei datei 1001 wird geschwindigkeit gewonnen das muss eben getestet werden.
__________________
Slava
http://bituniverse.com
Slava ist offline  
Alt 02.04.2007, 21:30  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Slava,

Zitat:
ich sage doch, dass bei mehreren dateien (mehr als 1000)im einem ordner dauert fopen(dateiname$id) manchmal langsamer als bei einem ordner mit 2 dateien.
Die Ursache ist in der Filesystem-Theorie zu suchen. Der Effekt fällt auf Einzel-Maschinen nicht so ins Gewicht wie auf eben Cluster-Filesystem, da dort mehrere Hosts konkurrierend um FLOCK's werben. Deshalb setzt man hier eine alternative Variante des Cachings ein. Das geht ungefähr so:

Man nehme einen Cache-Ordner und erstelle dort eine Unterordner-Struktur wie folgt:

Code:
/cache_root/
              00/
              01/
              [..]
              fe/
              ff/
Die Ordner-Namen sind die ersten zwei Zeichen eines md5-Hashes. Wenn du nun eine Datei cachen möchtest, z.B. anhand einer ID (z.B. 5), so generierst du dir den Cache-Dateinamen per

PHP-Code:
<?php
$ID
5;
$filename md5('Page_'.$ID);
$folder substr($filename,0,2);
$cachefile $folder.'/'.$filename;
?>
Anschließend nimmst du die ersten beiden Zeichen als Ordnernamen und schreibst die Cache-Datei dort hin. Somit erreichst du eine Unterteilung in mehrere Ordner und bist auf dem Filesystem auch erheblich schneller, weil über weniger INODES gescannt werden muss (=kleinerer INODE-Baum).
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. 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
Cookie zusätzlich für eine andere Domain setzen DonTermi PHP Tipps 2007 5 21.05.2007 13:52
Auf eine Flashanimation einen Link setzen andrew22 HTML, Usability und Barrierefreiheit 23 06.03.2007 15:28
Foto-Upload und gleichzeitig CHMOD auf 777 setzen Onkel-Tom PHP Tipps 2007 7 22.02.2007 10:45
Generell Variable als "global" setzen möglich ? simsalabim PHP Tipps 2006 18 19.05.2006 18:47
IMAP - Empfangsdatum auf Sendedatum zurück setzen Stephan PHP-Fortgeschrittene 9 08.05.2006 17:59
auto_increment auf null setzen? bona Datenbanken 3 05.04.2006 14:31
Lesezeichen für diesen Beitrag setzen kbdcalls Off-Topic Diskussionen 4 04.04.2006 22:40
Cookies: Wie viele darf eine Website setzen? SvenLittkowski PHP Tipps 2007 8 09.12.2005 20:54
Eine Startposition für das PHP-Script setzen PHP Tipps 2007 15 01.12.2005 16:54
[Erledigt] Gültigkeitsdauer eines Cookies lässt sich nicht setzen PHP Tipps 2005-2 8 21.10.2005 13:25
Absolute position in center setzen? Tic Rederon HTML, Usability und Barrierefreiheit 0 03.10.2005 22:19
Dateien erstellen und chmod setzen auch wenns nicht geht ^^ PHP Tipps 2005 8 22.05.2005 02:53
Cursor setzen HTML, Usability und Barrierefreiheit 3 05.03.2005 00:37
Parse Error - wie muss ich die Zeichen setzen? Calli PHP Tipps 2005 4 17.02.2005 14:57
2 Tabellen abfragen und dann variable unterschiedlich setzen Anuschka PHP Tipps 2004-2 2 22.12.2004 02:46

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php eof, eof setzen, eof php, http://www.php.de/php-tipps-2007/43835-eof-setzen.html, php end of file, php eof setzen, php fwrite eof, php datei eof, php textdatei eof, php file eof, php fread eof, php <<<eof, php eof schreiben, eof in php, eof zeichen php, php eof symbol, delfi eof setzen, php eof datei verkürzen, php binarysave read write, php script mit fopen dauert ewig

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:45 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.