php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 27.07.2005, 02:18  
Gast
 
Beiträge: n/a
Standard [Erledigt] print o. echo hängt bei feof => fread schleife (fsockopen

Hallo miteinander,

Kennt jemand das Problem oder eventuell ein Lösung?

Arbeite gerade an einem FTP-Client in HTML.
Nun soll der Download von einem FTP-server an den Browser weitergeleitet werden. Soweit so gut. Funktioniert eigendlich alles wunderbar. Nur das manchmal der Download abbricht.
Mal nach 5 sec, mal nach 5 min und dann gehts auch mal wieder.

Habe nun schon sehr lange nach dem Fehler gesucht.
Und folgendes festgestellt. Das Script:

PHP-Code:
<?php
// VORHER:
# anmelden
# passive verbindung
# port & ip auslesen
# RETR meindownload.zip

$fd = @fsockopen($ip,$port,&$err,&$errd,50);
//
while(!feof($fd)) {
     
$buffer = @fread($fd2048);
     
Logfile_save("v");
     print 
$buffer;              // HIER hängt es sich auf
     
Logfile_save("n");
}
?>

Das Script hängt sich manchmal bei print $buffer; auf.
Im Logfile steht:
Zitat:
v
n
v
n
v
Was ich versucht habe:
(1) echo probiert => gleiches P.
(2) socket_get_status() ausgegeben => kein time_out, etc.
(3) fpassthru($fd) statt schleife => gleiches P.
(4) socket_set_blocking($fd,false) => gleiches P.

Ich habe mir sogar ein paar andere Scripte geholt und probiert ob die
das können. Und die hängen sich auch auf.
Was mich jetzt total überfordert. Bisher bin ich davon ausgegangen
das ich irgend einen Fehler mache. Das scheint dann aber einer zu sein,
den die anderen auch machen. Blos welchen?

Vielen Dank

Jesko

PS: Der link zu phpinfo() http://www.layb.com/work/phpinfo.html
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 27.07.2005, 02:26  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

wie siehts mit max-execution-time aus?
vieleicht ein problem des servers auf den du connectest oder dort dann irgendwie "festgehalten wirst" ?
robo47 ist offline   Mit Zitat antworten
Alt 27.07.2005, 02:52  
Gast
 
Beiträge: n/a
Standard

Hallo robo47

ini_set("max_execution_time", "1200");
ini_set('memory_limit', '101M');

wie meinst Du "festgehalten wirst" ? Wie kann denn der andere Server mein
Script zum Stoppen bringen? Geht das?
Das Script hängt sich wenn dann definitiv immer beim print-Befehl auf.
Was irgendwie danach klingt das ich das Problem erzeuge.

Danke Jesko
  Mit Zitat antworten
Alt 27.07.2005, 03:12  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

hmm irgendwie hab ich das etwas verplant wo er hängt, hmm
vieleicht mal noch php version oder link auf php info posten,
robo47 ist offline   Mit Zitat antworten
Alt 27.07.2005, 03:13  
Gast
 
Beiträge: n/a
Standard

Eine wichtige Ergänzung noch dazu:


Script:
PHP-Code:
<?php
ignore_user_abort 
true );
$fd = @fsockopen($ip,$port,&$err,&$errd,50);
//
while(!feof($fd)) {
     
$buffer = @fread($fd2048);
     
Logfile_save("v");
     print 
$buffer;              // HIER hängt es sich auf;
     
if(connection_aborted()){
          
Logfile_save("Client hat aufgelegt.");
          break;
     }
     
Logfile_save("n");
}
?>
Das Logfile sagt:
Zitat:
v
n
v
n
v
n
v . . . . . . . . . . . . . . // HIER HÄNGT ES
Client hat aufgelegt. // Wenn man den Download abbricht, also die Verbindung HtmlServer <-> Browser trennt.
Wenn man den Download abbricht, also die Verbindung
HtmlServer <-> Browser
trennt, läuft das Script also wieder weiter.
Als ob irgend ein Puffer voll ist und das Script dann bei der Ausgabe anhält.
Ist in Opera und IE so. Also nicht Browserspezifisch.

Jesko

@robo47: Der link zu phpinfo() http://www.layb.com/work/phpinfo.html
  Mit Zitat antworten
Alt 27.07.2005, 09:02  
Erfahrener Benutzer
 
Registriert seit: 19.10.2004
Beiträge: 498
marsch
Standard

Moin,

also ich gehe mal nicht davon aus, dass sich irgendwas "aufhängt". Du versuchst, vom Socket 2048 Bytes oder einen Zeilenumbruch zu lesen, wenn beides nicht zutrifft, wartet das Script natürlich. Der Server sollte sagen, dass er fertig ist, außerdem sollte die Ausgabe des Servers (eventuell) ungepuffert passieren (wenn Du das einstellen kannst), so dass Du auf der Client-Seite ein Timeout einbauen kannst, wenn nach x Sekunden keine Daten mehr eingetroffen sind. Was steht denn im FTP-Log?
__________________
Cheers, Marco
marsch ist offline   Mit Zitat antworten
Alt 27.07.2005, 09:35  
Gast
 
Beiträge: n/a
Standard

Moin marsch,

hab den non-blocking mode (socket_set_blocking) auch schon ausprobiert. Der Socket bekommt Daten. Ich kann die auch immer noch validieren (wird als String erkannt)
bevor es sich beim print-Befehl aufhängt. Das ist definitiv der Punkt wo das Script sich aufhängt.

fpassthru verhält sich übrigens ähnlich. Wenn man die verbindung trennt läuft das script weiter. Und mal klappt der Download, mal nicht.
Hab jetzt das das Script mal auf einen anderen Server laufen. Da läuft es einwandfrei.
Ich glaube es handelt sich hier um einen serverspezifischen Grund.

Der link zu phpinfo() http://www.layb.com/work/phpinfo.html

Irgendwas scheine ich da zu übersehen. Andererseits sind die Fremdscripte auf meinem Server genauso unregelmäßig abgebrochen.( http://www.raditha.com/php/ftp/ )
Das muss doch irgendwas mit der Umgebung zu tun haben.
Ich habe keine Fehlerausgaben von PHP. Das Script sitzt einfach fest bis man den Download abbricht. Dann geht die schleife weiter und beendet das Script.(s.oben).

Jesko

PS: FTP-Log? Ich habe nur die xferlog_regular.processed von Plesk7.1.6 und die zeigt mir an das manche downloads complete und andere incomplete waren. Das Error-Logfile zeigt keinen fehler.
  Mit Zitat antworten
Alt 27.07.2005, 13:59  
Erfahrener Benutzer
 
Registriert seit: 19.10.2004
Beiträge: 498
marsch
Standard

Zitat:
Zitat von jesko
Das Script sitzt einfach fest bis man den Download abbricht. Dann geht die schleife weiter und beendet das Script.(s.oben).
Na sag ich doch, nichts hat sich aufgehängt, Dein Script wartet auf Zeilenende oder dass der Block von 2048 Zeichen voll wird. Setze das doch mal auf 1024 oder 512 runter, die Abbrüche sollten zurück gehen.
__________________
Cheers, Marco
marsch ist offline   Mit Zitat antworten
Alt 27.07.2005, 15:38  
Gast
 
Beiträge: n/a
Standard

Hallo marsch,

ich bin nicht sicher ob ich dich richtig verstanden habe, aber wie soll denn das der Grund sein.
Sieh Dir oben mal das Logfile an. Wenn er bei fread sich aufhängen würde müßte der letzte Eintrag
im Logfile "n" sein. Der Eintrag nach dem es aber hängt ist "v" und dieses "v" wird nach fread
und vor print in das Logfile geschrieben. Bei allen getesteten Downloads hatte $buffer auch einen
Inhalt.

Desweiteren verstehe ich bei deinem Ansatz auch nicht wie der Browserseitige Abbruch des Downloads
den Datentransfer zwischen HTML-Server und FTP-Server beeinflussen soll.

Vielleicht noch einmal genauer. Ich rufe über den Browser ein Script auf welches eine
Socket-Verbindung zu einem FTP-Server herstellt, eine Datei downloadet und die ankommenden
Datenpakete an den Browser weiterleitet.

Deine Überlegung hatte ich ja auch schon. Das meinte ich mit socket_set_blocking.
Das ist meines erachtens dafür da, dass wenn es keine Datenpackete gibt, das Script trotzdem weiterläuft.
http://de3.php.net/manual/de/functio...t-blocking.php

Script:

PHP-Code:
<?php
ignore_user_abort 
true );
$fd = @fsockopen($ip,$port,&$err,&$errd,50);
socket_set_blocking($fd,false);
//
while(!feof($fd)) {

     
$buffer = @fgets($fd1024);               // Daten in $buffer

            
$p socket_get_status($fd);        // Socketstatus in $p
            
$banf substr($buffer,0,1);         // erstes Zeichen von $buffer
            
$bend substr($buffer,-1);          // letztes Zeichen von $buffer

            
Logfile_save("v:".$p['unread_bytes']." >".$banf.":".$bend."<");   // unread_bytes, erstes & letztes Zeichen in Logfile schreiben

     
print $buffer;                                          // $buffer ausgeben => HIER hängt es sich auf;

     
if(connection_aborted()){                        // wenn der Klient auflegt
          
Logfile_save("Client hat aufgelegt.");  // Nachricht in Logfile schreiben
          
break;                                             // schleife beenden
     
}

            
Logfile_save("n");                                  // nach 'print' vor 'feof' 
}
?>
Hab das jetzt noch einmal durchlaufen lassen.
Wieder das gleiche.

Code:
v:0 >:<
n
v:0 >:<
n
v:8072 >M:
<
n
v:7049 >$:>*:
<
usw... bis:

v:2358 >Á:
<
n
v:1644 >i:
<
n
v:908 >§:
<			// Hier hängt er sich wieder auf (also vor Print mit Daten in $Buffer) und...
Client hat aufgelegt.   // Hier habe ich beim Browser den Download abgebrochen und das Script läuft weiter.
Hier das logfile ausführlicher: http://www.layb.com/work/logfile.txt

Und selbst wenn es mit den Zeichenmenge zu tun hätte, wäre das
keine Lösung. Was ist denn dann, wenn der FTP-Server nicht mal 512 Zeichen schafft.
Dann sollte das Script auch noch gehen.
Und wie schon gesagt: Auf anderen Servern habe ich keine Problem.


Danke Jesko
  Mit Zitat antworten
Alt 28.07.2005, 10:06  
Erfahrener Benutzer
 
Registriert seit: 19.10.2004
Beiträge: 498
marsch
Standard

Wie sieht "connection_aborted" aus?
__________________
Cheers, Marco
marsch ist offline   Mit Zitat antworten
Antwort


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
$error weiterleiten Benjamin PHP Tipps 2008 10 29.07.2008 11:59
Hash-Werte Raito PHP Tipps 2008 10 07.04.2008 15:47
Anfänger bittet um KleinLoginScriptPrüfung / PHP und MySql prinzli PHP Tipps 2008 10 08.11.2007 08:07
Formuilar hilfe imported_chewy PHP Tipps 2006 25 15.05.2006 15:14
Problem mit Print() und Echo() Verarbeitung. silverghost PHP-Fortgeschrittene 4 28.02.2006 12:07
Textarea und &amp;gt; PHP-Fortgeschrittene 9 07.02.2006 00:34
Problem mit While-Schleife PHP Tipps 2007 5 27.12.2005 20:02
[Erledigt] Formular formatieren HTML, Usability und Barrierefreiheit 5 30.01.2005 13:45
guestbook problem #2 PHP Tipps 2005 7 04.01.2005 11:19
Partykalender, Probleme PHP Tipps 2004-2 6 26.12.2004 13:19
get und if funktion PHP Tipps 2004 14 23.09.2004 04:01
mysql Fehler - query was empty Anuschka Datenbanken 2 01.09.2004 00:28
Datenbankergebnis in Array und per Index darauf zugreifen PHP Tipps 2004 7 30.07.2004 18:39
[Erledigt] Datenübergabe PHP Tipps 2004 2 20.07.2004 19:06
Gästebuch / Include Problem PHP Tipps 2004 9 14.07.2004 18:48

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
fread schleife, http://www.php.de/php-fortgeschrittene/27636-print-o-echo-haengt-bei-feof-fread-schleife-fsockopen.html, fsockopen schleife, fsockopen fread hängt, fread non blocking, php keine daten fsockopen fread, php fread nonblocking, fread php, php fread schleife, feof fsockopen, php download script browser hängt, echo print funktioniert nicht in schleife, fread dauerschleife, fsockopen fread print hängt, php feof schleife, php script stoppt bei fsockopen, fsockopen feof hängt, php fread put incomplete, feof fread, fread c block echo

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