2010-11-13 16 views
17

Ich zögere, diese Frage zu stellen, weil es seltsam aussieht. Aber trotzdem. Nur falls jemand das gleiche Problem schon begegnet war ... Dateisystem-Funktionen (fopem, Datei, file_get_contents) verhalten sich sehr seltsam für http: // Wrapperfile_get_contents gibt leere Zeichenfolge zurück

  • es scheinbar funktioniert. keine Fehler ausgelöst. fopen() gibt die Ressource zurück.
  • gibt es keine Daten für alle sicher arbeiten URLs (z. B. http://google.com/).
    Datei kehrt leeres Array, file_get_contents() leeren String zurückgibt, gibt fread falsche
  • für alle absichtlich falsch Urls (zB http://goog973jd23le.com/) verhält es sich genau das gleiche, außer für kleine [angeblich Domain-Lookup] Timeout, nach dem ich nicht bekommen Fehler (während sollte!) aber leere Zeichenfolge.
  • url_fopen_wrapper es auf
  • curl (beide Befehlszeile und PHP-Versionen) funktioniert gut, alle anderen Dienstprogramme und Anwendungen funktioniert gut, lokale Dateien geöffnet feinen

This error nicht anwendbar scheint, weil in meinem Fall gedreht wird funktioniert nicht für jede URL oder jeden Host.

php-fpm 5.2.11 Linux-Version 2.6.35.6-48.fc14.i686 ([email protected])

+0

Gibt es einen Grund, warum Sie nicht wollen, Libcurl benutzen? Scheint, wenn das funktioniert, könnte es ein idealer Ersatz für Sie sein. – Treffynnon

+1

@TREFFYNNON Ich schreibe gerade den Code um, um die Verwendung zu curlen, möchte aber trotzdem wissen, was mit file_get_contents() falsch ist. –

+0

Für welche URL funktioniert es nicht? – mario

Antwort

22

Ich habe dieses Problem auf meinem Server (mit PHP 5.3.3 auf Fedora 14) behoben, indem ich den --with-curlwrapper aus der PHP-Konfiguration entfernte und neu erstellte.

+1

Dies wurde heute erneut ausgelöst. Diesmal, wenn default_socket_timeout auf 0 gesetzt wurde (was unbegrenzt sein sollte), hat es sofort einen Fehler verursacht. –

+0

rettete meinen Tag, sehr hilfreich !!! Danke @Eric Caron –

4

Wenn Sie das HTTP-Stream-Wrapper PHP erstellt ein Array für Sie heißt $http_response_header nach file_get_contents() (oder eine der anderen f Familie von Funktionen) heißt. Dies enthält nützliche Informationen zum Status der Antwort. Könnten Sie eine var_dump() dieses Arrays machen und sehen, ob es Ihnen weitere Informationen über die Antwort gibt?

Es ist ein wirklich seltsamer Fehler, den Sie bekommen. Das einzige, was ich mir vorstellen kann, ist, dass etwas anderes auf dem Server die HTTP-Anfragen von PHP blockiert, aber dann kann ich nicht sehen, warum cURL immer noch in Ordnung wäre ...

+0

Der var_dump auf der http_header_response gibt einen NULL. –

+0

Sie meinten $ http_response_header, oder? – Jeremy

2

Ist http-Stream in Ihrer PHP-Installation registriert ? Suchen Sie nach "Registrierte PHP-Streams" in Ihrem phpinfo() Ausgang. Meine sagt "https, ftps, compress.zlib, compress.bzip2, php, file, glob, data, http, ftp, phar, zip".

Wenn es keine http gibt, setzen Sie in Ihrer php.iniallow_url_fopen auf on.

-1

Was sagt Ihnen ein Test mit fsockopen?

Ist der Test von anderem Code isoliert?

12

Klingt wie ein Fehler. Aber nur für die Nachwelt, hier sind ein paar Dinge, die Sie vielleicht debuggen möchten.

  • allow_url_fopen: bereits getestet
  • PHP unter Apache könnte sich anders verhalten als PHP-CLI und bei chroot/selinux/FastCGI/etc andeuten würde.Sicherheitseinschränkungen
  • lokaler Firewall: unwahrscheinlich, da curl funktioniert
  • Sperr User-Agent: Das ist durchaus üblich, tatsächlich, Websites blockieren Crawler und unbekannte Clients
  • transparente Proxy von Ihrem ISP, die entweder Mangeln oder Blöcke (PHP benutzer-

    : Mittel oder nicht-User-Agent könnte als Malware)
  • PHP Stream Wrapper Probleme, die PHPs

wie dem auch sei, Beweis Lassen Sie uns zunächst Stream-Handler sind funktional interpretiert werden

Dann versuchen Sie zu sehen, ob PHP überhaupt echte HTTP-Anfragen macht. Erster offener netcat auf der Konsole:

nc -l 80000 

und debuggen mit nur:

<?php 
    print file_get_contents("http://localhost:8000/hello"); 

Und von hier aus können Sie versuchen, mit PHP zu kommunizieren, ob etwas zurück, wenn Sie die Antwort variate. Geben Sie zuerst eine ungültige Antwort in netcat ein. Wenn kein Fehler ausgelöst wird, wird Ihr PHP-Paket gebrockt.

(Sie auch versuchen könnte, eine Kommunikation über "tcp: // .." handle dann.)

Als nächstes wird das Experimentieren mit Wrapper-Parameter http-Stream. Verwenden Sie wörtlich http://example.com/, die bekanntermaßen funktioniert und Benutzeragenten nie blockiert.

$context = stream_context_create(array("http"=>array(
    "method" => "GET", 
    "header" => "Accept: xml/*, text/*, */*\r\n", 
    "ignore_errors" => false, 
    "timeout" => 50, 
)); 

print file_get_contents("http://www.example.com/", false, $context, 0, 1000); 

Ich denke IGNORE_ERRORS hier sehr relevant ist. Aber check out http://www.php.net/manual/en/context.http.php und speziell versuchen, protocol_version auf 1.1 (wird chunked und fehlinterpretierte Antwort gesetzt, aber zumindest werden wir sehen, ob irgendetwas zurückgibt).

Wenn auch das bleibt erfolglos, dann versuchen Sie, den http-Wrapper zu hacken.

<?php 
    ini_set("user_agent" , "Mozilla/3.0\r\nAccept: */*\r\nX-Padding: Foo"); 

Dies wird nicht nur den User-Agent einstellen, sondern zusätzliche Header injizieren. Wenn es ein Verarbeitungsproblem beim Erstellen der Anforderung innerhalb des HTTP-Stream-Wrappers gibt, könnte dies möglicherweise sehr schnell dazu führen.

Andernfalls versuchen, alle Zend-Erweiterungen, Suhosin, PHP xdebug, APC und andere Kernmodule zu deaktivieren. Es könnte zu Störungen kommen. Sonst ist dies möglicherweise ein Problem, das spezifisch für das Fedora-Paket ist. Probieren Sie eine neue Version aus und prüfen Sie, ob sie auf Ihrem System weiterhin besteht.

-1

Ich hatte das gleiche Problem in Windows nach der Installation von XAMPP 1.7.7. Schließlich schaffte ich es zu lösen, indem Sie die folgende Zeile (während mit allow_url_fopen = On) php.ini Zugabe:

extension = php_openssl.dll

Verwandte Themen