Ankündigung

Einklappen
Keine Ankündigung bisher.

curl request ohne antwort abzuwarten

Einklappen

Neue Werbung 2019

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

  • curl request ohne antwort abzuwarten

    hallo ihr lieben

    wieder einmal habe ich ein problem, deren lösung ich alleine nicht fündig werde. (nicht, dass ich es nicht versucht hätte!)

    bitte nicht fragen, warum das was ich vorhabe sinn macht oder eben nicht. ich denke, das müsste man getrennt disskutieren. hier geht es mir lediglich um die lösung meines problemes, bzw. um alternativen.

    also zum problem:
    wie der titel schon verät, möchte ich einen request in php absetzen (vorzugsweise einen GET request). das skript soll sofort nach dem absetzen beendet werden. d.h. es soll die antwort des requestes garnicht abgewartet werden. bisher habe ich das so gemacht:
    PHP-Code:
    function GetRequestNoAnswer($url)
    {
        
    //http:// vorstellen, wenn nicht vorhanden
        
    if (strpos($url"http://") === false$url "http://".$url;
        
        
    //Request senden
        
    if (($fp = @fsockopen($host = @parse_url($urlPHP_URL_HOST), 80$errno$errstr1)) === false) return false;
        else @
    fwrite($fp"GET /".@parse_url($urlPHP_URL_PATH)." HTTP/1.1\r\nHost: $host\r\nConnection: Close\r\n\r\n");

        
    //zurückgeben
        
    return @fclose($fp);

    das funktioniert so schon ganz gut ... zumindest solange eine verbindung hergestellt werden kann ... ganz genau: gebe ich eine "nicht" url ein, dann kommt E_WARNING: fsockopen() [function.fsockopen]: php_network_getaddresses: getaddrinfo failed: Name or service not known

    und genau das schaffe ich nicht zu unterdrücken. das @ vor fsockopen hat scheinbar keine wirkung. da mir ein solches verhalten bei curl nicht bekannt war, habe ich es mit dieser funktion versucht ... und tatsächlich funktioniert das auch recht fehlerfrei ... falsche urls werden ohne E_WARNINGs als solche erkannt und meine funktion liefert false. das problem ist nun, dass wenn die seite existiert und der request gesendet wird, auch notwendigerweise die antwort gelesen wird, was meinem skript zeit kostet (abhängig von der gegenseite einige sekunden), die verschwendet ist.

    und nun die frage: wie kann ich entweder die E_WARNING umgehen (ohne das error log level zu ändern) oder das ganze mit curl realisieren?

    vielen dank,
    LG

  • #2
    Zitat von devil13 Beitrag anzeigen
    bitte nicht fragen, warum das was ich vorhabe sinn macht oder eben nicht. ich denke, das müsste man getrennt disskutieren. hier geht es mir lediglich um die lösung meines problemes, bzw. um alternativen.
    Sinnvolle Lösungen kann es nur geben, wenn die Aufgabenstellung und ihr Zweck bekannt sind.


    das problem ist nun, dass wenn die seite existiert und der request gesendet wird, auch notwendigerweise die antwort gelesen wird, was meinem skript zeit kostet (abhängig von der gegenseite einige sekunden), die verschwendet ist.
    Vielleicht möchtest du HEAD als Request-Methode nutzen ...?
    [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

    Kommentar


    • #3
      Zitat von ChrisB Beitrag anzeigen
      Sinnvolle Lösungen kann es nur geben, wenn die Aufgabenstellung und ihr Zweck bekannt sind.
      habe ich zwar eigentlich beides erwähnt aber mach ich auch gerne nochmal

      aufgabe: ein request abzusetzen, ohne eine antwort abzuwarten
      zweck: zeit einsparen, indem ich keine antwort abwarten muss
      sinn: da ich die antwort eh nicht brauch, mich also nur interessiert, ob eine verbindung zur gegenstelle aufgebaut werden konnte oder nicht, brauch ich damit keine zeit "verschwenden", die antwort auszulesen. (angenommen ich möchte mehrere solcher requests nacheinander absetzen und das senden inklusive empfangen dauert im schnitt 1-2 sekunden ... dann addierert sich das ganze recht schnell so hoch, dass unakzeptable laufzeiten meines skriptes entstehen ... hingeghen der request ohne response dauert ca. 1/4 sekunde, was für mich akzeptabler ist, als die erste möglichkeit)

      Zitat von ChrisB Beitrag anzeigen
      Vielleicht möchtest du HEAD als Request-Methode nutzen ...?
      korrigiere mich, wenn ich da falsch liege ... im wesentlichen ändert das nichts an meinem problem ... denn mit fsockopen entsteht der gleiche fehler und mit curl muss ich nach wie vor warten (wenn auch nicht so lange wie zuvor, was unweigerlich eine verbesserung wäre, aber nicht meinem ziel entspricht)
      und außerdem (das skript auf der gegenseite wird nicht mehr ausgeführt und ich kann auch keine parameter mitgeben ...)

      LG

      Kommentar


      • #4
        Zitat von devil13 Beitrag anzeigen
        sinn: da ich die antwort eh nicht brauch, mich also nur interessiert, ob eine verbindung zur gegenstelle aufgebaut werden konnte oder nicht, brauch ich damit keine zeit "verschwenden", die antwort auszulesen.
        Wenn dich wirklich nur das interessiert - dann mach einen Ping.
        [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

        Kommentar


        • #5
          dankeschön lieber CrisB

          Zitat von ChrisB Beitrag anzeigen
          Wenn dich wirklich nur das interessiert - dann mach einen Ping.
          das ist zwar nicht meine endgültige lösung, dennoch hast du mir den entscheidenden denkanstoß gegeben 1000 dank dafür!


          ich habe zuerst wirklich versucht ein ping zu machen. das hätte an sich auch funktioniert. dennoch wollte ich mir die möglichkeit vorbehalten parameter bei request mit zu übergeben ... also GET oder POST ... demnach habe ich erst einen ping gemacht und im erfolgsfall den request ... somit blieb mein E_ERROR also aus und ich war erstmal glücklich.

          dann bin ich über die funktion gethostbyname gestolpert ... sie versucht einen string in eine ip aufzuschlüsseln ... gelingt dies nicht, liefert sie den eingegebenen string zurück ... naja ... genaugenommen liefert sie immer einen string zurück :P ... eben wird der string nur im erfolgsfall in eine ip verändert ... naja ... wie auch immer ... ich habe mir mit preg_match also noch eine funktion gebaut, die erkennt, ob ich eine ip übergeben habe und fertig war meine lösung für mein kleines problem

          für alle die das selbe problem haben oder die es aus anderen gründen interessiert:
          PHP-Code:
          function IsStrIP($ip) {return preg_match("/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\$/"$ip) != 0;}
          function 
          GetRequestNoAnswer($url)
          {
              
          //http:// vorstellen, wenn nicht vorhanden
              
          if (strpos($url"http://") === false$url "http://".$url;
              
          //url entschlüsseln
              
          if (($host = @parse_url($urlPHP_URL_HOST)) === false OR ($phad = @parse_url($urlPHP_URL_PATH)) === false) return false;
              
          //url eine reguläre Adresse? (kann adresse in IP aufgeschlüsselt werden)
              
          if (@IsStrIP($ip = @gethostbyname($host)) === false) return false;
              
              
          //kann eine Verbindung zur Gegenstelle aufgebaut werden?
              
          if (($fp = @fsockopen($ip80$errno$errstr1)) === false) return false;
              
          //Request senden
              
          @fwrite($fp"GET /$phad HTTP/1.1\r\nHost: $host\r\nConnection: Close\r\n\r\n");

              
          //Erfolg zurückgeben
              
          return @fclose($fp);

          LG

          Kommentar


          • #6
            sinn: da ich die antwort eh nicht brauch, mich also nur interessiert, ob eine verbindung zur gegenstelle aufgebaut werden konnte oder nicht, brauch ich damit keine zeit "verschwenden", die antwort auszulesen.
            Das ist Unsinn. Auch die Info „ob eine verbindung zur gegenstelle aufgebaut werden konnte“ kann nur über eine Antwort erfolgen. Ein reiner Sender kann ohne Rückkanal nichts über seine Empfänger erfahren.
            [COLOR="#F5F5FF"]--[/COLOR]
            [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
            [COLOR="#F5F5FF"]
            --[/COLOR]

            Kommentar


            • #7
              Du kannst das Script für den Request auslagern und per exec() direkt ausführen und ihr das Resultat in eine DB schreiben lassen oder derartiges.
              "Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".

              Kommentar


              • #8
                Du könntest auch eine ganz Simple lösung verwenden, wenn deine Struktur das ermöglicht.
                Mach eine Umleitung per header('Location: '); vergesse das exit(); und mach mit curl das was du tun musst.

                Das sollte alle deine Probleme lösen.

                Kommentar


                • #9
                  Zitat von nikosch Beitrag anzeigen
                  Das ist Unsinn. Auch die Info „ob eine verbindung zur gegenstelle aufgebaut werden konnte“ kann nur über eine Antwort erfolgen. Ein reiner Sender kann ohne Rückkanal nichts über seine Empfänger erfahren.
                  ja tut mir leid ich habe mir php selbst beigebracht ... ich hatte nur c++ in der schule ... und da war nicht viel mit internet usw ... also verzeih mir bitte, wenn ich sachen falsch darstelle ... du hast soweit ich das beurteilen kann natürlich recht, dass eine aufgebaute verbindung impliziert, dass die gegenstelle antwortet ... ich denke trotzdem, dass klar geworden ist, wass ich wollte, denn

                  ChrisB, Dark Guardian und Creator haben (ohne meine unwissenheit zu kritisieren) sehr kreative lösungsmöglichkeiten genannt, auf die ich selbst nie gekommen wäre ...

                  inwiefern mir exec() dabei helfen wird, werde ich ausprobieren ... bis jetzt habe ich ja meine lösung für mein problem gepostet ... mal schaun, obs noch verbessert werden kann ... ich bleib auf jeden fall noch dran

                  also nochmal vielen dank für eure kreativen ideen, ohne die ich wahrscheinlich mein kleinen problem immernoch hätte^^

                  LG

                  Kommentar


                  • #10
                    Ich wollte das nur klarstellen. Es ist schon wichtig zu wissen, wovon man spricht und dabei korrekt zu bleiben.
                    [COLOR="#F5F5FF"]--[/COLOR]
                    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                    [COLOR="#F5F5FF"]
                    --[/COLOR]

                    Kommentar

                    Lädt...
                    X