Ankündigung

Einklappen
Keine Ankündigung bisher.

xml-string an Host senden

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • xml-string an Host senden

    Hallo zusammen,

    ich muss einen XML-String an einen Server schicken.
    Der Server erfordert eine Authentifizierung.

    Nun haben wir ein IBM-System i auf dem ein Apache mit PHP(5) läuft.
    Der Server ist über eine DSL-16Mbit Leitung ans WWW angebunden.

    Folgendes habe ich bereits versucht :
    PHP-Code:
    $fp1 fopen("./anfrage.xml","r");
    $kennung base64_encode("user:pass");
    while(!
    feof($fp1))
    {
        
    $file1 fgets($fp1100);
        
    $file $file.$file1;
    }
    $data "";
    $fp fsockopen("ssl://server.com",443,$errstr,$errno);
    if(!
    $fp)
    {
        die();
    }
    else

        
    $file addslashes($file);
        
    $data $file;
        
    fputs($fp"POST /webservice/XMLServlet HTTP/1.0\r\n");
        
    fputs($fp"Host: server.com\r\n");
        
    fputs($fp"Authorization: Basic ".$kennung." \r\n");
        
    fputs($fp"Content-length: "strlen($data) ."\r\n");
        
    fputs($fp"Content-type: application/x-www-form-urlencoded\r\n");
        
    fputs($fp"Connection: close\r\n\r\n");
        
    fputs($fp$data);
    }
    while(!
    feof($fp))
    {
        
    $fget fgets($fp128);
        
    $data .= $fget;
    }
    fclose($fp);
    $xml_arr explode("\r\n\r\n",$data);
    echo 
    $xml_arr[1]; 
    Die Antwort kommt nach ca. 14 Sekunden (bei 1 Artikel).
    Bei 5 Artikeln dauert es 30 Sekunden.
    Dieser Teil :
    PHP-Code:
    while(!feof($fp))
    {
        
    $fget fgets($fp128);
        
    $data .= $fget;

    dauert alleine 10 Sekunden.

    Das Ganze habe ich mit Curl versucht, wobei es fast genauso lange dauert.

    Wenn ich das Script auch einem Webserver teste (im Web bei 1und1) dann dauert es nur 3-5 Sekunden.

    Kann ich an der Performance etwas ändern ?
    Gibt es PHP-Einstellungen, die etwas bringen könnten ?
    Gibt es alternativen zu meinen beiden Varianten ?

    Bitte um eure Hilfe.

    Gruß jogi

  • #2
    Hast du denn mal irgendwie analysiert wo es hängt ? CPU ? Leitung ?

    Wie wäre es einfach mal ein Bandbreiten-Überwachungstool auf dem Rechner (oder besser dem Router) zu installieren und zu schauen wie viel Bandbreite genutzt wird ? Vielleicht andere User/Rechner im Netz die noch die Leitung benutzen ? Belegt vielleicht noch etwas anderes die Leitung ?

    Der Server hängt über ne 16.000er Leitung dran, du schickst ihm Daten, also ist primär der Upload der Leitung relevant, das dürfte ~768kbit bis 1 Mbit sein ? Das sind um die ~ 100kb/s. Wie viele kb hat denn der XML-Kram ?
    Bißchen Overhead (CPU + Bandbreite) für SSL dazu.

    Mal versucht in größeren Stücken einzulesen und zu schicken ?
    anstatt der 100 / 128 bytes
    Zum Datei einlesen z.b. direkt mit file_size() arbeiten ? Dann liest er in einem Stück ein ?

    file_get_contents, wäre noch eine Möglichkeit fürs einlesen der XML.

    Kommentar


    • #3
      ok, danke werd ich prüfen.

      vielleicht hast du, oder jemand anderes ne idee,
      warum Variante 1 mit Curl funktioniert, und warum Variante 2 mit fsockopen nicht geht ?
      Variante 1:
      PHP-Code:
      $url "http://xmltest.server.com/servlet/Test";
      $page "/servlet/Test";
      $headers = array(
          
      "POST ".$page." HTTP/1.0",
          
      "Content-type: text/xml;charset=\"utf-8\"",
          
      "Accept: text/xml",
          
      "Cache-Control: no-cache",
          
      "Pragma: no-cache",
          
      "SOAPAction: \"run\"",
          
      "Content-length: ".strlen($file),
          
      "Authorization: Basic " $kennung
      );

      $ch curl_init();
      curl_setopt($chCURLOPT_URL,$url);
      curl_setopt($chCURLOPT_RETURNTRANSFER1);
      curl_setopt($chCURLOPT_TIMEOUT60);
      curl_setopt($chCURLOPT_SSL_VERIFYPEER0);
      curl_setopt($chCURLOPT_SSL_VERIFYHOST0); 
      curl_setopt($chCURLOPT_HTTPHEADER$headers);
      curl_setopt($chCURLOPT_USERAGENT$_SERVER['HTTP_USER_AGENT']);
      curl_setopt($chCURLOPT_POST1);
      curl_setopt($chCURLOPT_POSTFIELDS$file); 

      $data curl_exec($ch); 

      if (
      curl_errno($ch)) 
      {
          print 
      "Error: " curl_error($ch);

      else 
      {
          
      curl_close($ch);

      Variante 2:
      PHP-Code:
      $fp fsockopen("xmltest.server.com",80,$errstr,$errno,30);
      echo 
      "Step 2 : ".date("d.m.Y - H:i:s")."
      \n"
      ;
      if(!
      $fp)
      {
          die();
      }
      else
      {
          
      //$data = "postdata=".$file;
          
      $data addslashes($file);
          
      $data $file;
          
      fputs($fp"POST /servlet/Test HTTP/1.1\r\n");
          
      fputs($fp"Host: xmltest.server.com\r\n");
          
      fputs($fp"Authorization: Basic ".$kennung." \r\n");
          
      fputs($fp"Content-length: "strlen($data) ."\r\n");
          
      fputs($fp"Content-type: application/x-www-form-urlencoded\r\n");
          
      fputs($fp"Connection: close\r\n\r\n");
          
      fputs($fp$data);
      }
      echo 
      "Step 3 : ".date("d.m.Y - H:i:s")."
      \n"
      ;
      while(!
      feof($fp))
      {
          
      $fget fgets($fp128);
          
      $data .= $fget;
      }
      fclose($fp); 

      Kommentar

      Lädt...
      X