php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 03.05.2006, 17:03  
Neuer Benutzer
 
Registriert seit: 03.05.2006
Beiträge: 19
vegeta
Standard CURL aufrufe in Klasse verpacken

Hallo,

Ich versuche mittels CURL mit einem Server zu kommunizieren,
habe versucht alles in eine Klasse zu packen. Aber CURL setzt die Klassenvariablen wieder auf NULL nach Beendigung.
Beim debuggen konnte ich mich vergewissern, dass die Klasse ein bischen macht was ich will
Leider finde ich kaum was im internet und bin eigentlich jetzt nur noch am rum probieren.
Hier der code:
Code:
<?php 
class CurlReader {
    var $body;
    var $headers;
    var $c;
    function CurlReader() {
        $iheaders[]= "Content-Type: text/xml";
        $iheaders[]= "Pragma: no-cache";
        $this->c = curl_init();
        curl_setopt($this->c, CURLOPT_HEADER, 1);
        curl_setopt($this->c, CURLOPT_SSL_VERIFYPEER, "false");
        curl_setopt($this->c, CURLOPT_HTTPHEADER, $iheaders);
        curl_setopt($this->c, CURLOPT_POST, 1);
        curl_setopt($this->c, CURLOPT_POSTFIELDS, 'etwas');
        curl_setopt($this->c, CURLOPT_HEADERFUNCTION, array($this,'parseHeader'));
        curl_setopt($this->c, CURLOPT_WRITEFUNCTION, array($this, 'parseBody'));
    }
   function parseHeader($curl, $data) 
   {
       list($header, $value) = explode(': ', $data, 2);
       $this->headers[$header] = value;
    }
    }
   function parseBody($curl, $data) 
   {
        $this->body .= $data;
    }
     function get($url) {
        $this->headers = array();
        $this->body = '';
        curl_setopt($this->c, CURLOPT_URL, $url);               
        return curl_exec($this->c);
     }
    function close()
    {
         curl_close($this->c);
    }
     function getbody()
    {
        return $this->body;
     }
}
    $c->get('https://www.server.de);
     print $c->getbody();
     $erg= $c->getbody();

$c->close();

?>
vegeta ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 03.05.2006, 17:54  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 4.651
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

1. Formatiere den mal schön und verwende überall die gleichen Abstände zum Einrücken. Das sieht ja gar grauselig aus.

2. So, wie du den Code gepostet hast, ist die Klassendefinition zu CurlReader völlig überflüssig. Da fehlt noch eine Zeile, wie beispielsweise: $c = new CurlReader();

3. Welche Klassenvariablen werden auf NULL gesetzt? Nach welcher "Beendigung"?
__________________
Entwickler aus Leidenschaft und ein Zahnrad in einem der größten Java-Projekte der Welt.
mepeisen ist offline  
Alt 03.05.2006, 19:32  
Gast
 
Beiträge: n/a
Standard

Poste den Code, wie er bei Dir läuft. Gerne auf das Wesentliche reduziert.
Aber trotztdem lauffähig und nachvollziehbar.

Parser-Fehler in Form von größzügig gesetzten } oder vergessenen Zeilen
haben dort also nichts verloren.

Das obligatorische error_reporting mit einem Fehlerlevel von mindestens
E_ALL, hast Du anscheinend auch nicht verwendet bzw. berücksichtigt.

Weiterhin:
Zitat:
PHP-Code:
<?php
   
function parseBody($curl$data
   {
        
$this->body .= $data;
    }
?>
Handbuch lesen! Die Methode ist so schlichtweg falsch. Selbiges gilt für
parseHeader().
Zitat:
Zitat von [url
http://de.php.net/curl_setopt[/url]]Must return the exact number of bytes written or this will fail.
Etwaige Fehler mit curl_error() abzufangen, kann nie schaden...

Sollte Deine Klasse unter PHP 4 laufen, solltest Du außerdem beachten,
dass als Callback-Funktion die Methode einer _Kopie_ des Objekts
aufgerufen wird.
 
Alt 04.05.2006, 15:23  
Neuer Benutzer
 
Registriert seit: 03.05.2006
Beiträge: 19
vegeta
Standard

Hallo,

danke für die beiträge.
ihr habt absolut recht, ist ja richtig furchbar. Habe nicht gewusst das die formatierung verloren geht. Auf ein neues.
Code:
<?php

error_reporting(E_ALL);

class CurlReader {
    var $body;
    var $headers;
    var $c;
    var $fh;
    
    function CurlReader() 
    {
        $iheaders[]= "Content-Type: text/xml";
        $iheaders[]= "Pragma: no-cache";
        $this->c = curl_init();
        $this->fh = fopen('curl-response-headers.txt','w');
        curl_setopt($this->c, CURLOPT_VERBOSE, 1);
        curl_setopt($this->c, CURLOPT_HEADER, 1);
        curl_setopt($this->c, CURLOPT_STDERR, $this->fh);
        curl_setopt($this->c, CURLOPT_SSL_VERIFYPEER, "false");
        curl_setopt($this->c, CURLOPT_HTTPHEADER, $iheaders);
        curl_setopt($this->c, CURLOPT_POST, 1);
        curl_setopt($this->c, CURLOPT_POSTFIELDS, 'hier steht der HTTPBody');
        curl_setopt($this->c, CURLOPT_HEADERFUNCTION, array($this,'parseHeader'));
        curl_setopt($this->c, CURLOPT_WRITEFUNCTION, array($this, 'parseBody'));
    }
    
     function parseHeader($curl, $data) 
     {
         list($header, $value) = explode(': ', $data, 2);
         if (strlen($header = trim($header))) 
         {
              $this->headers[$header] = trim($value);
         }
         return strlen($data);
     }
    
     function parseBody($curl, $data) 
     {
        $this->body .= $data;
        return strlen($data);
     }

     function get($url) 
     {
        $this->headers = array();
        $this->body = '';
        curl_setopt($this->c, CURLOPT_URL, $url);               
        return curl_exec($this->c);
     }

    function close()
    {
    	curl_close($this->c);
    	fclose($this->fh);
    }
    
    function getBody()
    {
       return $this->body;
    }

    function getHeader()
   {
       return $this->header;
   }
}

//Klasse wird an dieser Stelle benutzt
$c = new CurlReader();
$page=$c->get('https://irgendeinserver.de');
print $c->getbody();
$ergbody= $c->getBody();
$ergheader= $c->getHeader();
$c->close();
 
?>
Sorry keine Ahnung warum, aber ich hab vorher völligen mißt gepostet.
Das problem ist das die variable $ergbody und $ergheader leer bleiben.
Im Debug modus kann ich aber sehen das Daten vearabeiten werden.

Zitat:
Sollte Deine Klasse unter PHP 4 laufen, solltest Du außerdem beachten,
dass als Callback-Funktion die Methode einer _Kopie_ des Objekts
aufgerufen wird.
wie mach ich das?


Danke
gruss
vj
vegeta ist offline  
Alt 05.05.2006, 13:28  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von vegeta
wie mach ich das?
Mmh .. Du könntest es mal mit einem & vor $this versuchen...


Zitat:
Zitat von vegeta
PHP-Code:
<?php
  curl_setopt
($this->cCURLOPT_WRITEFUNCTION, array($this'parseBody'));
?>
Warum verwendest Du hier eigentlich nicht einfach Folgendes?
PHP-Code:
<?php
  curl_setopt
($this->cCURLOPT_RETURNTRANSFERtrue);
?>
Dann kannst Du den Rückgabewert von curl_exec() in der Eigenschaft body
speichern. Sollte ja so zum gleichen Ergebnis führen und erspart Dir somit
Deine Methode und den Ärger mit ihr...
 
Alt 08.05.2006, 12:54  
Neuer Benutzer
 
Registriert seit: 03.05.2006
Beiträge: 19
vegeta
Standard

Hallo,

erstmal danke für die tipps,
also ich verwende

Code:
<?php 
  curl_setopt($this->c, CURLOPT_RETURNTRANSFER, 1); 
?>
macht das selbe wie

Code:
<?php 
  curl_setopt($this->c, CURLOPT_RETURNTRANSFER, true); 
?>
aber mit dem benutzen von

Code:
<?php 
  curl_setopt($this->c, CURLOPT_WRITEFUNCTION, array($this, 'parseBody')); 
?>
liefert curl_exec() nur noch false oder true zurück

ok wie du gesagt hast hatt ich auch schon gemacht wollt das ganze einwenig strukturieren, aber habe nicht erwartet das dies so kompliziert wird.
Mitlerweile hab ich es hin bekommen, werden den code demnächst posten

gruss
vj
vegeta ist offline  
Alt 11.05.2006, 16:17  
Neuer Benutzer
 
Registriert seit: 03.05.2006
Beiträge: 19
vegeta
Standard

Hallo,

ich hab jetzt einwenig weiter gemacht, ich verstehe nicht warum die klasse weiter oben nicht funktioniert.
sobald curlexec ausgeführt wurde steht in der $this->header variable nichts mehr.
wenn ich in den debug modus gehe sehe ich wie die variable gefüllt wird.
Woran könnte das liegen, was muss man anderes machen?

gruss
vj
vegeta ist offline  
Alt 12.05.2006, 19:42  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von vegeta
sobald curlexec ausgeführt wurde steht in der $this->header variable nichts mehr.
wenn ich in den debug modus gehe sehe ich wie die variable gefüllt wird.
Woran könnte das liegen, was muss man anderes machen?
Wie bereits oben angemerkt, arbeitet PHP 4 - wenn nicht explizit anders
angegeben - mit der Kopie des Objekt und nicht mit einer Referenz.

Deine Callback-Funktionen füllen also nicht die Instanzvariablen Deines
Objekts, sondern die einer Kopie von diesem.

Hättest Du Dir die Antworten durchgelesen und versucht zu verstehen,
wüsstest Du auch, wie das zu verhindern ist:
PHP-Code:
<?php
  curl_setopt
($this->cCURLOPT_WRITEFUNCTION, array(/*=>*/&/*<=*/$this'parseBody'));
?>
Da Dir auch der new-Operator nur eine Kopie des Objekts zurückliefert,
muss auch hier explizit mit Referenzen gearbeitet werden:
PHP-Code:
<?php
  $c 
=& new CurlReader();
?>
Eine andere Möglichkeit wäre natürlich die WRITEFUNCTION-Option nicht
im Konstruktor, sondern beispielsweise erst in Deiner get()-Methode zu
setzen.


Oder aber Du löst Dein Problem doch über RETURNTRANSFER - wie oben
vorgeschlagen, da Deine Methode ja faktisch keinerlei Zusatzfunktionalität
implementiert und somit in dieser Form schlichtweg überflüssig ist.

Zitat:
Zitat von vegeta
liefert curl_exec() nur noch false oder true zurück
Dass Dir curl_exec() hier kein TRUE oder FALSE zurückliefert, ist doch
kein wirkliches Problem. Deine get()-Methode kann den Rückgabewert
in Abhängigkeit davon, ob Daten zurückgeliefert wurden, ja selber
definieren.
 
Alt 16.05.2006, 11:03  
Neuer Benutzer
 
Registriert seit: 03.05.2006
Beiträge: 19
vegeta
Standard

Hallo,

vielen Dank für die Hilfe, ich werde es gleich mal ausprobieren.
Aber irgenwie logisch, bin kein PHP Spezialist komme aus der Java-Welt.
Hast mir jetzt echt weiter geholfen.

Gruss

vj
vegeta 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
Variable aus Klasse herausbekommen GSJLink PHP Tipps 2008 7 16.02.2008 22:25
String-Parser Klasse - was muss rein? Matze PHP Tipps 2007 2 08.04.2007 22:14
Eine Klasse mehrere Dateien sn00py PHP Tipps 2006 6 08.05.2006 11:40
mehr als eine Klasse einbinden Alpha Centauri PHP-Fortgeschrittene 4 13.04.2006 20:56
aus einer funktion auf funktion anderer klasse zugreifen seejay PHP Tipps 2006 3 05.01.2006 10:37
Klasenname einer nicht instanziierten Klasse DerDesian PHP Tipps 2007 9 30.11.2005 13:13
Instanz einer Klasse in einer anderen Klasse verwenden Buhmann PHP-Fortgeschrittene 7 28.10.2005 23:12
[Erledigt] Führerschein für Klasse A+B.. Preis OK??? Off-Topic Diskussionen 20 13.07.2005 18:44
Rückgabewert auf einer Klasse anders als in der Klasse micbur PHP Tipps 2005-2 6 10.06.2005 15:06
Problem mit Übergabe einer Klasse in PHP4 PHP-Fortgeschrittene 10 08.01.2005 21:00
[Erledigt] PHP nachträglich mit CURL Support ausstatten PHP-Fortgeschrittene 2 20.12.2004 16:19
Klasse holt sich die Klasse PHP-Fortgeschrittene 9 07.10.2004 11:53
[Erledigt] Brauche Hilfe bei meiner ersten Klasse PHP-Fortgeschrittene 9 24.09.2004 17:09
Klassenobjet in anderer Klasse benutzen inu PHP Tipps 2004 6 19.09.2004 10:58
Klasse ändern UniQ PHP Tipps 2004 5 24.08.2004 14:46

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
curl klasse, php curl class, curl explode, curl class php, function get xml($curl), curl php klasse, curl class, curlopt_writefunction class, php curlopt_writefunction, curl in klasse, curl curlreader java, php curl liefert nur header, writefunction curl array c, curl in class verwenden, curl in klasse verwenden, curl php curlopt_headerfunction parse body, curl php curlopt_headerfunction klasse, php curl header parse explode, curl_init aus klasse, curl php class

Alle Zeitangaben in WEZ +1. Es ist jetzt 08:58 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.