Funktion http_request() existiert nicht?

Olivenbaum

Grünschnabel
Hallo,

ich bekomme den Fehler
Code:
Fatal error: Call to undefined function http_request() in .... on line 8
.

Jedoch sagt mir php.net, dass diese Funktion standardmäßig bei PHP dabei ist. (Habe schon in PHP5 und PHP4 getestet, jedes mal das gleiche Ergebnis...)

http://www.php.net/manual/en/function.http-request.php

Nun meine Frage: gibt es eine gleichwertige Funktion mit der ich einen HTTP Request inklusive POST Daten abschicken kann oder weiß jemand wie ich http_request() "aktivieren" kann?
Meine Seite ist auf einem 1&1 shared Server gehostet falls das hilft.

MfG,
Olivenbaum
 
PECL pecl_http:1.0.0-1.5.5

http_request ist eine expansion :) Man muss PECL runterladen und dann installieren, aber ich glaube nicht, dass du diese Expansion auf deinem Server installieren könntest, es sei denn du hast einen V-Server oder Rootserver :)
 
Okay vielen Dank.

Habe mich von dieser Seite verwirren lassen, denn dort steht nichts von Erweiterungen.

Da ich die Erweiterung nicht installieren kann, brauch ich nun eine Ausweichslösung...

Gibt es eine Möglichkeit mit fopen() oder file_get_contents() POST Daten zu senden? Oder hat jemand einen ganz anderen Lösungsansatz?
 
ja gibt es, wie sagt man doch so schön, viele wege führen Rom. :)
PHP:
fsockopen // Verbindung öffnen
fputs // Daten schicken
fgets // Daten empfangen
feof // f = file, e = end, o = of, f = file ;) Praktisch gesehen wenn man die daten empfängt könnte man in ner while schleife z.B so

while(!feof($fp)) {
      $res .= fgets($fp, 256);
  }
  fclose($fp);

// Wobei $fp der Filepointer ist.
 
Ok, nun das nächste Problem (gehört aber immer noch zur Thematik):

Error:
Code:
Warning: fsockopen() [function.fsockopen]: unable to connect to www.XXXXXXX.de:80 (Connection timed out) in /homepages/XXXXXXXXXXXXXXXXXXX.php on line 64

Hier die Zeile 64:
Code:
  $fp = fsockopen("www.XXXXXXX.de", 80, &$errno, &$errstr, 30);

(Seltsamerweise tritt der Fehler in ca 3% der Fälle nicht auf (bei gleichem Host), gibt es da ein serverinternes Timeout o.ä. das zu viele Verbindungen in kurzer Zeit verhindert?)

Nach Googlesuche hab ich nicht exakt mein Problem gefunden, aber ähnliche, welche sich nur durch Umkonfiguration der Server lösen ließen. Meine Frage dazu: ist das eine Sache meines Servers (1&1 shared Hosting) oder lässt sich das durch ein Workaround lösen? Wie gesagt, brauche ich eine Möglichkeit ein POST request an eine fremde Website zu senden...
 
Dass du (zeitweise) keine Verbindung zu entfernten Servern aufbauen kannst, kann, so weit ich das sehe, viele Gründe haben.

...viele Verbindungen in kurzer Zeit...
Wie viele Verbindungen? Wie kurz ist denn die Zeit?

Workarounds für Post-Requests sind mir nicht bekannt. Entweder die PECL Erweiterung, oder die Möglichkeit mit der fsockopen-Funktion.

Versuch es mal mit der Funktion (extra für dich gemacht :p)
PHP:
<?php
function postBote($bURL, $bRequest, $bAnswer = 0, $bDebug = 0){
  $bQuery = parse_url($bURL, PHP_URL_QUERY);
  $bPath  = parse_url($bURL, PHP_URL_PATH);
  $bHost  = parse_url($bURL, PHP_URL_HOST);
  
  if(!empty($bQuery))
    $bPath .= "?".$bQuery;
  
  if(empty($bPath))
    $bURL .= "/";
  
  if($bDebug != 0)
    echo("Information: Host ist ".$bHost.", Pfad ist ".$bPath."\r\n");
  
  if(($oHandle = @fsockopen($bHost, 80, $oErrorNo, $oErrorStr, 30)) === false)
    return ($bDebug == 0) ? false : "Fehler: Verbindung fehlgeschlagen. ".$oErroNo." - ".$oErrorStr."\r\n";
  
  if($bDebug != 0)
    echo("Information: Verbunden\r\n");
  
  $oHeader   = array();
  $oHeader[] = 'POST '.$bPath.' HTTP/1.1';
  $oHeader[] = 'Host: '.$bHost;
  $oHeader[] = 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12';
  $oHeader[] = 'Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5';
  $oHeader[] = 'Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3';
  $oHeader[] = 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7';
  $oHeader[] = 'Connection: close';
  $oHeader[] = 'Content-Type: application/x-www-form-urlencoded';
  $oHeader[] = 'Content-Length: '.strlen($bRequest);
  
  foreach($oHeader as $oHeaderNow){
    fputs($oHandle, $oHeaderNow."\r\n");
  }
  fputs($oHandle, "\r\n".$bRequest);

  if($bDebug != 0)
    echo("Information: Anfrage verschickt\r\n");
  
  if($bAnswer == 0)
    return true;
  
  if($bDebug != 0)
    echo("Information: Empfange antwort\r\n");
  
  $oReturn = "";
  while(!feof($oHandle)){
    $oReturn .= fgets($oHandle, 512);
  }
  
  if($bAnswer == 1)
    return $oReturn;
  
  if($bDebug != 0)
    echo("Information: Splitte Antwort in Header und Content\r\n");
  
  list($oHeader, $oContent) = explode("\r\n\r\n", $oReturn, 2);
  
  if($bAnswer == 2)
    return $oHeader;
  
  if($bAnswer == 3)
    return $oContent;
  
  return true;
}
?>


Beschreibung
Code:
1. Parameter = URL
2. Parameter = Post-Request
3. Parameter = Antwort
               0 = Keine Antwort (schnell) (Standard)
               1 = Antwort
               2 = Nur Header
               3 = Nur Content
4. Parameter = Debug
               0 = Kein Debug (Standard)
               1 = Debug
Rückgabe = Falls erfolgreich String
           ansonsten je nach 4. Parameter false oder String


Beispiel, so könnte man bei Tutorials.de im Forum nach Fische suchen und die Antwort (Content) ausgeben.
PHP:
<?php
/* Funktion */
if(($brief = postBote("http://www.tutorials.de/forum/search.php?do=process", "s=&do=process&searchthreadid=&query=Fische&titleonly=1&searchuser=&starteronly=0&exactname=1&replyless=0&replylimit=0&searchdate=0&beforeafter=after&sortby=lastpost&order=descending&showposts=0&childforums=1&dosearch=Suchen&saveprefs=1", 3)) !== false){
  echo($brief);
}else{
  echo("Da ist etwas schief gelaufen :(");
}
?>
 
Zuletzt bearbeitet:
Dankeschön für deine tolle Funktion, die klappt mit dem Beispiel wunderbar :)

Nur die URL, die ich aufrufen will gibt immer nen "Fehler: Verbindung fehlgeschlagen. - Connection timed out" aus. Das scheint wirklich eine Sache des Servers zu sein. Könnte es sein, dass der Server der Ziel URL dies nicht zulässt?
 
Zurück