jogi: XML String an Server schicken (HTTPS)

Hallo zusammen,

ich schicke eine XML-Datei per HTTP POST an einen Server der firma X.
Der Server generiert daraufhin eine Antwort.

[PHP]
$file = "";
$fp1 = fopen("./anfrage.xml","r");
$kennung = base64_encode("user:pass");
while(!feof($fp1))
{
    $file1 = fgets($fp1, 100);
    $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($fp, 128);
    $data .= $fget;
}
fclose($fp);
$xml_arr = explode("\r\n\r\n",$data);
echo $xml_arr[1];
[/PHP]

Die Antwort kommt nach ca. 10 Sekunden.

Nun gibt es von der Firma X einen Testsimulator, der eine XML-Anfrage an den Server schickt, bei dem die Antwort schon nach 2 Sekunden kommt.
[PHP]
<form method=POST target="Output" action="https://server.com">
  <textarea name="xml_data" rows="10" cols="56">
     -- gleicher inhalt wie in anfrage.xml
  </textarea>
  <input type=submit  value="   START SIMULATION   ">
</form>
[/PHP]
Da der Server eine Anmeldung erfordert kommt nach dem Aufruf ein Anmeldefenster, ansonsten werden die gleichen Daten an den Server geschickt.

Kann mir jemand erkären, wieso meine Variante so viel langsamer ist ?
Welche Möglichkeiten gibt es noch, die Daten per HTTPS an den Server zu schicken ?
(CURL habe ich schon probiert, dauert auch 10 Sekunden.)

Gruß jogi

  1. echo $begrüßung;

    ich schicke eine XML-Datei per HTTP POST an einen Server der firma X.
    Der Server generiert daraufhin eine Antwort.
    Die Antwort kommt nach ca. 10 Sekunden.
    Nun gibt es von der Firma X einen Testsimulator, der eine XML-Anfrage an den Server schickt, bei dem die Antwort schon nach 2 Sekunden kommt.
    Kann mir jemand erkären, wieso meine Variante so viel langsamer ist ?

    Eine mögliche Erklärung wäre: Der Testserver verarbeitet die Daten nicht, nimmt sie nur entgegen und verwirft sie. Es kann deshalb schneller antworten.

    Wenn du etwas erklärt haben möchtest, muss es zunächst untersucht werden. Bau in dein Script Messpunkte ein, die dir die aktuelle Zeit und die Position ausgeben. Somit kannst du ermitteln, welcher Teil wie lange braucht.

    echo "$verabschiedung $name";

    1. echo $begrüßung;

      ich schicke eine XML-Datei per HTTP POST an einen Server der firma X.
      Der Server generiert daraufhin eine Antwort.
      Die Antwort kommt nach ca. 10 Sekunden.
      Nun gibt es von der Firma X einen Testsimulator, der eine XML-Anfrage an den Server schickt, bei dem die Antwort schon nach 2 Sekunden kommt.
      Kann mir jemand erkären, wieso meine Variante so viel langsamer ist ?

      Eine mögliche Erklärung wäre: Der Testserver verarbeitet die Daten nicht, nimmt sie nur entgegen und verwirft sie. Es kann deshalb schneller antworten.

      Wenn du etwas erklärt haben möchtest, muss es zunächst untersucht werden. Bau in dein Script Messpunkte ein, die dir die aktuelle Zeit und die Position ausgeben. Somit kannst du ermitteln, welcher Teil wie lange braucht.

      echo "$verabschiedung $name";

      Hallo nochmal,

      ich habe die Sache untersucht.
      Das Script läuft auf einem IBM-Server im Haus bei uns unter php.
      Die Anbindung ist DSL 16000.

      Von den 10 Sekunden benötigt dieser Teil allein 5 Sekunden:
      [PHP]
      while(!feof($fp))
      {
          $fget = fgets($fp, 128);
          $data .= $fget;
      }

      [/PHP]

      1. echo $begrüßung;

        [PHP]
        [/PHP]

        http://forum.de.selfhtml.org/hilfe/bedienung.htm#syntax-highlighting

        Von den 10 Sekunden benötigt dieser Teil allein 5 Sekunden:
        while(!feof($fp))
        {
            $fget = fgets($fp, 128);
            $data .= $fget;
        }

        Warum bildest du file_get_contents() nach?

        echo "$verabschiedung $name";

        1. echo $begrüßung;

          [PHP]
          [/PHP]

          http://forum.de.selfhtml.org/hilfe/bedienung.htm#syntax-highlighting

          Von den 10 Sekunden benötigt dieser Teil allein 5 Sekunden:
          while(!feof($fp))
          {
              $fget = fgets($fp, 128);
              $data .= $fget;
          }

          Warum bildest du file_get_contents() nach?

          echo "$verabschiedung $name";

          weil das in jedem fsockopen Beispiel steht, das im Internet zu finden ist.
          http://de3.php.net/manual/de/function.fsockopen.php/

          1. echo $begrüßung;

            Warum bildest du file_get_contents() nach?
            weil das in jedem fsockopen Beispiel steht, das im Internet zu finden ist.
            http://de3.php.net/manual/de/function.fsockopen.php/

            Ah, 'tschuldigung, das hatte ich grad mit dem ersten sehr ähnlichen Konstrukt verwechselt, und wollte mich schon wundern, dass das so langsam sein soll. Beim fsockopen() wirst du wohl nicht drumrumkommen, das so zu machen. Die Ursache für den Zeitverbrauch wirst du wohl nicht großartig beeinflussen können, Die Antwort- und Übertragungszeit liegt nicht in deiner Macht.

            Wer verbrät eigentlich den Großteil der anderen 5 Sekunden?

            echo "$verabschiedung $name";

            1. echo $begrüßung;

              Warum bildest du file_get_contents() nach?
              weil das in jedem fsockopen Beispiel steht, das im Internet zu finden ist.
              http://de3.php.net/manual/de/function.fsockopen.php/

              Ah, 'tschuldigung, das hatte ich grad mit dem ersten sehr ähnlichen Konstrukt verwechselt, und wollte mich schon wundern, dass das so langsam sein soll. Beim fsockopen() wirst du wohl nicht drumrumkommen, das so zu machen. Die Ursache für den Zeitverbrauch wirst du wohl nicht großartig beeinflussen können, Die Antwort- und Übertragungszeit liegt nicht in deiner Macht.

              Wer verbrät eigentlich den Großteil der anderen 5 Sekunden?

              echo "$verabschiedung $name";

              Na ja, die Konstellation ist so:
              IBM System i mit Apache und PHP inhouse.
              PHP Script wird aufgerufen und stellt Verbindung zur DB2 vom i5OS her.
              Daten werden gelesen, aus denen der XML-Datenstrom generiert wird.
              dauert so ca 2-3 Sekunden.
              dann kommt der fsockopen ins internet mit fputs < 1 sek
              dann while 5 sek
              dann response verarbeiten ca 1-2sek

              1. gibt es ausser curl noch andere Möglichkeiten XML Daten per https an einen Server zu senden ?

              2. echo $begrüßung;

                Wer verbrät eigentlich den Großteil der anderen 5 Sekunden?
                Na ja, die Konstellation ist so:
                IBM System i mit Apache und PHP inhouse.
                PHP Script wird aufgerufen und stellt Verbindung zur DB2 vom i5OS her.
                Daten werden gelesen, aus denen der XML-Datenstrom generiert wird.
                dauert so ca 2-3 Sekunden.

                Wenn das die erste while-Schleife ist, dann probier es mit file_get_contents(). Das Lesen der Datenblocks in die eine Variable und das Zusammenkopieren mit der anderen sollte nicht so viel kosten, aber unnötig aufwendig ist das schon. Wie groß ist denn die Datenmenge?

                echo "$verabschiedung $name";

                1. echo $begrüßung;

                  Wer verbrät eigentlich den Großteil der anderen 5 Sekunden?
                  Na ja, die Konstellation ist so:
                  IBM System i mit Apache und PHP inhouse.
                  PHP Script wird aufgerufen und stellt Verbindung zur DB2 vom i5OS her.
                  Daten werden gelesen, aus denen der XML-Datenstrom generiert wird.
                  dauert so ca 2-3 Sekunden.

                  Wenn das die erste while-Schleife ist, dann probier es mit file_get_contents(). Das Lesen der Datenblocks in die eine Variable und das Zusammenkopieren mit der anderen sollte nicht so viel kosten, aber unnötig aufwendig ist das schon. Wie groß ist denn die Datenmenge?

                  echo "$verabschiedung $name";

                  Die Datenmenge ist gering.
                  so ca 2-10KB.

                  Es ist nur so, wenn ich das gleiche Script auf meinem Webserver laufen lasse, dann dauert die 5 Sekunden-Schleife nur 1 Sekunde.
                  desshalb dachte ich, man könnte da etwas machen.

  2. Hallo Jogi,

    $file = addslashes($file);

    $data = $file;

    fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
        fputs($fp, "Connection: close\r\n\r\n");
        fputs($fp, $data);

      
    da schlägt es bei mir 13.  
      
      
      
    1\.) Eine normale POST-Anfrage mit file-uplodad sieht in etwa  
        so aus:  
      
    
    >  POST / HTTP/1.0  
    >  Host: server.com  
    >  Connection: close  
    >  Content-Type: multipart/form-data; boundary=78093053618503561511269903723  
    >  Content-Length: 186  
    >   
    >  --78093053618503561511269903723  
    >  Content-Disposition: form-data; name="file"; filename="DNS\_Server.txt"  
    >  Content-Type: text/plain  
    >   
    >  217.146.128.77  
    >  195.226.7.66  
    >  217.173.157.225  
    >  --78093053618503561511269903723--  
      
        Der Content-Type "application/x-www-form-urlencoded" bei  
        Dir ist völlig falsch. Bitte konsultiere die einschlägi-  
        gen Spezifikationen unter [HTML 4.01](http://www.w3.org/TR/html401/interact/forms.html#form-content-type) und [RFC 2388](http://tools.ietf.org/html/rfc2388)!  
      
    2\.) Der Inhalt der anfrage.xml soll übertragen werden. Warum  
        veränderst Du ihn durch addslashes()? Die Gegenstelle  
        muss diesen nun auch noch mit einem Debugger wieder in  
        wohlgeformtes XML umwandeln.  
      
      
    Dass das alles in allem so lange dauert, kann u. U. auch mit den Fehlern zusammen hängen.  
      
      
    Gruß aus Berlin!  
    eddi  
    
    -- 
    Diese Nachricht ist made in Rixdorf und wurde mittels 100% recycelter Elektronen verfasst.  
    Und der Strom? Äh - kommt aus der Steckdose! :)