Smarty Forum Index Smarty
WARNING: All discussion is moving to https://reddit.com/r/smarty, please go there! This forum will be closing soon.

/tmp voll mit 0 byte Files

 
This forum is locked: you cannot post, reply to, or edit topics.   This topic is locked: you cannot edit posts or make replies.    Smarty Forum Index -> Language: German
View previous topic :: View next topic  
Author Message
q_no
Smarty Rookie


Joined: 22 Nov 2005
Posts: 13
Location: germany

PostPosted: Mon Mar 05, 2007 2:28 pm    Post subject: /tmp voll mit 0 byte Files Reply with quote

Hallo,

ich habe auf einem WebCluster mit mehreren Servern das Problem dass in /tmp Tonnen von Dateien mit 0 byte landen. Die Namen beginnen alle mit "wrt".
Google brachte mich auf den Gedanken, dass diese Files möglicherweise von Smarty erzeugt werden.
Auf einem der Server wurden heute Mittag noch 3 Files erzeugt die quasi den gesamten Output einer einzelnen Seite als serialisiertes array/objekt enhalten... hier mal ein kurzer Auszug:

Code:

File: wrtFujOjj         Col 0              48536 bytes                                                                                                      0%
261
a:4:{s:8:"template";a:5:{s:57:"KundeXXX/standard/SEITE/tpl/seite_csc_datinganmeldung.tpl";b:1;s:12:"_HTML_HEADER";b:1;s:6:"ABSATZ";b:1;s:6:"BANNER";b:1;s:12:"
_HTML_FOOTER";b:1;}s:9:"timestamp";i:1173094685;s:7:"expires";i:1173098285;s:13:"cache_serials";a:0:{}}

Den Rest habe ich hab abgeschnitten, da der HTML Output wohl nicht interessieren dürfte und zudem recht lang ist.


Ich habe auch schon die ForenSuche hier bemüht aber bin leider nicht wirklich fündig geworden. Andere User mit dem Problem bekamen keine oder nur unzureichende Antworten.

Anfangs habe ich vermutet es wären Session Files die nicht gelöscht wurden, allerdings nutze ich einen MySQL Session Handler und schreibe demzufolge keine SessionDaten nach /tmp, geschweige denn irgendwelche Smarty-Objekte in die Session oder nach /tmp.

Hat vllt jemand einen Tipp woran dies liegen könnte?

Ich nutze die Smarty Vers 2.6.14 unter Suse 10.1 mit PHP 5.12. Webserver ist lighttpd mit fast-cgi.

Auf einem Entwicklungsserver mit Gentoo, Apache2 und PHP 5.14 nutze ich das selbe (Smarty)CMS und habe dort nur ein paar 0byte files von Sep letzten Jahres gefunden sowie eine von Januar diesen Jahres. Alles in Allem sehr merkwürdig - auf mich wirkt die Erzeugung der Files ziemlich random.
_________________
$_REQUEST - WHAT YOU $_POST IS WHAT YOU $_GET
Back to top
View user's profile Send private message Visit poster's website
messju
Administrator


Joined: 16 Apr 2003
Posts: 3336
Location: Oldenburg, Germany

PostPosted: Mon Mar 05, 2007 3:06 pm    Post subject: Reply with quote

Die Dateien werden in smarty_core_write_file() erzeugt. Sie sollten aber nicht in /tmp sondern in den jeweiligen Cache- oder Compile-Verzeichnissen angelegt werden und auch sofort nach dem schreiben umbenannt werden.

Warum das bei Dir nicht so ist muss an magelnden Dateirechten bzw. anderen lokalen Einstellungen liegen.
Back to top
View user's profile Send private message Send e-mail Visit poster's website
q_no
Smarty Rookie


Joined: 22 Nov 2005
Posts: 13
Location: germany

PostPosted: Mon Mar 05, 2007 3:32 pm    Post subject: Reply with quote

ok, soweit auch meine bisheringen Vermutungen.

Die Smarty cache/compile dirs liegen bei mir zb in /var/smarty_cache/cache bzw /var/smarty_cache/compile - sprich fernab von /tmp. Es ist mir ein Rätsel wie der Pfad zustande kommt.

Ich habe noch herausgefunden, dass in /tmp nur dann volle HTML outputs landen (wie oben im Quote beschrieben) wenn ich die Website mit "defekten urls" aufrufe. Die sehen dann ungefähr so aus http://example.com/test.php?foo=bar?wrongparameter=somevalue

Meine Cache/Compile-IDs sind immer die aufgerufenen URLs inklusive aller GET-Parameter um nicht alle 2Mio Parameter einzeln abfragen und als cache-id zusammenbauen zu müssen. Das mag vllt etwas quick&dirty wirken, aber bei 3000+ einzelnen Seiten die teils Parameter gesteuert sind möchte sicher niemand die Parameter von selbst als eindeutige CacheID zusammenbauen.

Allerdings kann ich das Problem mit den 0byte files nicht reproduzieren. Heute waren es 120.000 Files pro Server - alle in /tmp und leer. Dabei hat's natürlich einen Webserver entschärft und der Rest konnte die Last nichtmehr bewältigen. Danach ist das Problem erst aufgefallen.

Das komische ist, daß an manchen Tagen pro Minute hunderte Files erzeugt wurden - dann aber wieder eine Woche lang garnichts.
_________________
$_REQUEST - WHAT YOU $_POST IS WHAT YOU $_GET
Back to top
View user's profile Send private message Visit poster's website
q_no
Smarty Rookie


Joined: 22 Nov 2005
Posts: 13
Location: germany

PostPosted: Mon Mar 05, 2007 6:00 pm    Post subject: Reply with quote

messju, kannst du mir evtl verraten an welcher Stelle smarty den Parameter
$params['filename'] (smarty_core_write_file() Zeile 27) zusammenbaut?


Wenn ich einfach mal ein print einbaue zum Debuggen, dann bekomme ich folgendes:

/tmp/wrtlk4slU
/tmp/wrtQwzKto
/tmp/wrtVxo8ES
/tmp/wrthFsLTm

statt wie zu erwarten die angegeben Compile Pfade....
_________________
$_REQUEST - WHAT YOU $_POST IS WHAT YOU $_GET
Back to top
View user's profile Send private message Visit poster's website
messju
Administrator


Joined: 16 Apr 2003
Posts: 3336
Location: Oldenburg, Germany

PostPosted: Mon Mar 05, 2007 6:56 pm    Post subject: Reply with quote

z.b. in smarty_core_write_cache_file().
Back to top
View user's profile Send private message Send e-mail Visit poster's website
q_no
Smarty Rookie


Joined: 22 Nov 2005
Posts: 13
Location: germany

PostPosted: Mon Mar 05, 2007 10:18 pm    Post subject: Reply with quote

ah, nu kenne ich zumindest den grund


Quote:

01. $_tmp_file = tempnam($_dirname, 'wrt');
02. if (!($fd = fopen($_tmp_file, 'wb'))) {
03. $_tmp_file = $_dirname . DIRECTORY_SEPARATOR . uniqid('wrt');
04. if (!($fd = fopen($_tmp_file, 'wb'))) {
05. $smarty->trigger_error("problem writing temporary file '$_tmp_file'");
06. return false;
07. }
08. }


in Zeile 1 ist $_tmp_file /tmp/wrtumYklE
Sollte der Zugriff fehlschlagen (in meinem Fall "open basedir restriction", weil hat dort nix zu suchen) wird versucht die tmp file in (Zeile 03) /srv/www/htdocs/smartycache/compile//%%C7/C71/wrt45ec9404e0c53 anzulegen.

PHP schreibt aber in Zeile 2 beim Versuch die file zu öffnen eine 0byte file auf die Platte, um festzustellen daß es das nicht darf. In meinem Fall leider unbemerkt 120.000 Stück. Ist das genereller PHP Bug?

Ich wollte jetzt ungern einen cronjob einrichten der täglich nach 0byte files Ausschau hält.
_________________
$_REQUEST - WHAT YOU $_POST IS WHAT YOU $_GET
Back to top
View user's profile Send private message Visit poster's website
gnuffmaster
Smarty Elite


Joined: 13 Jul 2006
Posts: 440
Location: Düsseldorf, Germany

PostPosted: Tue Mar 06, 2007 7:47 am    Post subject: Reply with quote

Quote:
Sollte der Zugriff fehlschlagen (in meinem Fall "open basedir restriction", weil hat dort nix zu suchen)

Wieso haben Temporäre Dateien im tmp Verzeichnis nix zu suchen? Wie willst Du denn z.B. einen Dateiupload nutzen, wenn PHP die hochgeladene Datei nicht in den tmp Ordner laden kann? Oder wenn Du doch mal Datei basierte Session nutzen willst? Geht ja alles nicht.

Code:
PHP schreibt aber in Zeile 2 beim Versuch die file zu öffnen eine 0byte file auf die Platte, um festzustellen daß es das nicht darf. ... Ist das genereller PHP Bug?

Ist mir noch nie passiert/aufgefallen das PHP beim Versuch zu schreiben trotzdem eine 0 byte Datei anlegt auch wenn es nicht darf. Denke eher nicht das hier das Problem oder ein Bug liegt.
tempnam() erzeugt eine eindeutige Datei im Angegebenen Verzeichnis. Wenn dieses nicht existiert, dann wird die Datei im tmp Verzeichnis erstellt. Also wird bereits in Zeile 1 Deine Datei erstellt. Schau also mal auf was $_dirname steht und ob es das Verzeichnis überhaupt gibt. Sieht nämlich nicht so aus, da er wie Du geschrieben hast danach ja tmp drin stehen hat.
Back to top
View user's profile Send private message Visit poster's website
q_no
Smarty Rookie


Joined: 22 Nov 2005
Posts: 13
Location: germany

PostPosted: Tue Mar 06, 2007 8:48 am    Post subject: Reply with quote

gnuffmaster wrote:

Wieso haben Temporäre Dateien im tmp Verzeichnis nix zu suchen? Wie willst Du denn z.B. einen Dateiupload nutzen, wenn PHP die hochgeladene Datei nicht in den tmp Ordner laden kann? Oder wenn Du doch mal Datei basierte Session nutzen willst? Geht ja alles nicht.


richtig, soll auch nicht Das ist ein WebCluster aus mehreren Servern. Die Sessions werden via MySQL gespeichert und FileUploads gibt es nicht. Daher ist eigentlich auch nicht zwingend ein /tmp notwendig.

gnuffmaster wrote:


Ist mir noch nie passiert/aufgefallen das PHP beim Versuch zu schreiben trotzdem eine 0 byte Datei anlegt auch wenn es nicht darf. Denke eher nicht das hier das Problem oder ein Bug liegt.
tempnam() erzeugt eine eindeutige Datei im Angegebenen Verzeichnis. Wenn dieses nicht existiert, dann wird die Datei im tmp Verzeichnis erstellt. Also wird bereits in Zeile 1 Deine Datei erstellt. Schau also mal auf was $_dirname steht und ob es das Verzeichnis überhaupt gibt. Sieht nämlich nicht so aus, da er wie Du geschrieben hast danach ja tmp drin stehen hat.


Das Verzeichnis $_dirname in Zeile 1 ist: /srv/www/cache/compile//%%C7/C71/

Die Funktion tempnam generiert als Fallback, sollte $_dirname nich existieren, eine file in /tmp.
Naja, ich werde ertmal versuchen rauszufinden warum gelegentlich keine Schreibzugriffe auf das eigentliche ZielDir möglich waren. Derzeit erzeugen die Systeme keine 0byte files sondern laufen wie gewünscht durch.
_________________
$_REQUEST - WHAT YOU $_POST IS WHAT YOU $_GET
Back to top
View user's profile Send private message Visit poster's website
gnuffmaster
Smarty Elite


Joined: 13 Jul 2006
Posts: 440
Location: Düsseldorf, Germany

PostPosted: Tue Mar 06, 2007 11:09 am    Post subject: Reply with quote

Quote:
richtig, soll auch nicht Das ist ein WebCluster aus mehreren Servern. Die Sessions werden via MySQL gespeichert und FileUploads gibt es nicht. Daher ist eigentlich auch nicht zwingend ein /tmp notwendig.
OK hab ich nicht dran gedacht Wink , trotzdem sollte es schon möglich sein ins /tmp zu schreiben.

Quote:
Die Funktion tempnam generiert als Fallback, sollte $_dirname nich existieren, eine file in /tmp.
Ja genau das hab ich doch auch geschrieben. Nur mit der Erweiterung das hier in jedem Fall schon versucht wird eine Datei zu erzeugen. Und zwar in $_dirname. Sonst in /tmp.

Wenn nun also $_tmp_file in Zeile 1 bereits ein /tmp enthält, dann kann er wohl nicht in $_dirname schreiben oder $_dirname existiert nicht.
Back to top
View user's profile Send private message Visit poster's website
q_no
Smarty Rookie


Joined: 22 Nov 2005
Posts: 13
Location: germany

PostPosted: Tue Mar 06, 2007 11:14 am    Post subject: Reply with quote

Das seltsame ist, dass die 0byte files auf einmal nicht mehr erzeugt werden. Dafür aber tmp files die den gesamten Output enthalten (serialisiertes array, siehe oben). Über Nacht waren es rund 7000files - die website läuft trotz allem ohne Probleme. Alle Seiten werden richtig gerendert und dargestellt - nur bleiben gelegentlich in /tmp ein paar Files zurück. Das kann ich mir absolut nicht erklären - wenn die Seite generell Probleme beim Schreiben hätte, dürfte auch eigentlich mein gesamtes Caching nicht funktionieren - was es aber eindeutig trotzdem tut.... ratlos Rolling Eyes
_________________
$_REQUEST - WHAT YOU $_POST IS WHAT YOU $_GET
Back to top
View user's profile Send private message Visit poster's website
Display posts from previous:   
This forum is locked: you cannot post, reply to, or edit topics.   This topic is locked: you cannot edit posts or make replies.    Smarty Forum Index -> Language: German All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group
Protected by Anti-Spam ACP