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

  • devil13
    hat ein Thema erstellt curl request ohne antwort abzuwarten.

    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

  • nikosch
    antwortet
    Ich wollte das nur klarstellen. Es ist schon wichtig zu wissen, wovon man spricht und dabei korrekt zu bleiben.

    Einen Kommentar schreiben:


  • devil13
    antwortet
    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

    Einen Kommentar schreiben:


  • Creator
    antwortet
    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.

    Einen Kommentar schreiben:


  • Dark Guardian
    antwortet
    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.

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    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.

    Einen Kommentar schreiben:


  • devil13
    antwortet
    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

    Einen Kommentar schreiben:


  • ChrisB
    antwortet
    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.

    Einen Kommentar schreiben:


  • devil13
    antwortet
    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

    Einen Kommentar schreiben:


  • ChrisB
    antwortet
    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 ...?

    Einen Kommentar schreiben:

Lädt...
X