2010-11-13 8 views
17

Je suis hésité à poser cette question car elle a l'air bizarre. Mais de toute façon. Juste au cas où quelqu'un avait rencontré le même problème déjà ... fonctions du système de fichiers (fopem, fichier, file_get_contents) se comportent très étrange pour http: // wrapperfile_get_contents renvoie la chaîne vide

  • cela fonctionne apparemment. aucune erreur n'a été relevée. fopen() renvoie la ressource.
  • il ne renvoie aucune donnée pour toutes les URL de travail (par exemple, http://google.com/).
    retourne fichier de tableau vide, file_get_contents() retourne une chaîne vide, fread retourne false
  • pour tous les urls intentionnellement mauvais (par exemple http://goog973jd23le.com/), il se comporte exactement de la même, sauf peu délai d'attente [soi-disant de recherche de domaine], après que je reçois pas erreur (alors que devrait!) mais chaîne vide.
  • url_fopen_wrapper est activée
  • boucle (à la fois en ligne de commande et les versions de php) fonctionne très bien, tous les autres services et applications fonctionne très bien, les fichiers locaux ouverts fin

This error semble inapplicable parce que, dans mon cas, ne fonctionne pas pour chaque URL ou hôte.

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

+0

Y at-il des raisons pour lesquelles vous ne voulez pas utiliser libcurl? Il semble que si cela fonctionne, il pourrait être un remplacement idéal pour vous. – Treffynnon

+1

@Treffynnon Je suis en train de réécrire le code pour boucler l'utilisation en ce moment, mais je veux tout de même savoir ce qui ne va pas avec file_get_contents() –

+0

Pour quelle URL spécifique cela ne fonctionne-t-il pas? – mario

Répondre

22

J'ai corrigé ce problème sur mon serveur (exécutant PHP 5.3.3 sur Fedora 14) en supprimant le --with-curlwrapper de la configuration PHP et en le reconstruisant.

+1

Déclenchée par ceci encore aujourd'hui, cette fois ayant default_socket_timeout mis à 0 (qui devrait signifier illimité) l'a fait échouer immédiatement. –

+0

Sauvé ma journée, très utile !!! Merci @Eric Caron –

4

Lorsque vous utilisez le PHP gestionnaire de flux http crée un tableau pour vous appelé $http_response_header après file_get_contents() (ou toute autre famille de fonctions f) est appelée. Cela contient des informations utiles sur l'état de la réponse. Pourriez-vous faire un var_dump() de ce tableau et voir si cela vous donne plus d'informations sur la réponse?

C'est une erreur vraiment bizarre que vous obtenez. La seule chose que je peux penser est que quelque chose d'autre sur le serveur bloque les requêtes http de PHP, mais alors je ne vois pas pourquoi cURL serait encore ok ...

+0

Le var_dump sur le http_header_response donne une valeur NULL. –

+0

Vous vouliez dire $ http_response_header, non? – Jeremy

2

Est-ce que http stream est enregistré dans votre installation PHP? ? Recherchez "Flux PHP enregistrés" dans votre sortie phpinfo(). La mienne dit "https, ftps, compress.zlib, compress.bzip2, php, file, glob, data, http, ftp, phar, zip".

S'il n'y a pas de http, définissez allow_url_fopen sur dans votre php.ini.

-1

Qu'est-ce qu'un test avec fsockopen vous dit?

Le test est-il isolé d'un autre code?

12

Cela ressemble à un bogue. Mais juste pour la postérité, voici quelques choses que vous pourriez vouloir déboguer.

  • allow_url_fopen: déjà testé
  • PHP sous Apache pourrait se comporter différemment que PHP-CLI, et évoquerait chroot/SELinux/FastCGI/etc.restrictions de sécurité
  • pare-feu local: peu probable puisque boucle fonctionne
  • blocage de l'agent utilisateur: cela est assez fréquent en fait, les sites Web bloc robots d'exploration et des clients inconnus
  • proxy transparent de votre fournisseur d'accès Internet, qui soit calandres ou des blocs (PHP par l'utilisateur agent ou non-agent utilisateur pourrait être interprété comme malware)
  • problèmes wrapper flux PHP

Quoi qu'il en soit, la première preuve de let que les gestionnaires de flux phps sont fonctionnels:

<?php 
    if (!file_get_contents("data:,ok")) { 
      die("Houston, we have a stream wrapper problem."); 
    } 

Ensuite, essayez de voir si PHP fait de vraies requêtes HTTP. netcat première ouverture sur la console:

nc -l 80000 

Et debug avec juste:

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

Et à partir de là, vous pouvez essayer de communiquer avec PHP, voir si quelque chose retourne si vous Variate la réponse. Entrez une réponse invalide en premier dans netcat. S'il n'y a pas d'erreur, votre paquet PHP est bloqué.

(Vous pouvez également essayer de communiquer sur une « tcp: // .. » gérer ensuite.)

Ensuite expérimente avec des paramètres d'enveloppe de flux http. Utilisez littéralement http://example.com/, qui fonctionne et ne bloque jamais les user-agents.

$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); 

Je pense ignore_errors est ici très pertinente. Mais vérifiez http://www.php.net/manual/en/context.http.php et en particulier essayer de définir protocol_version à 1,1 (obtiendra une réponse fragmentée et mal interprétée, mais au moins nous verrons si quoi que ce soit retourne).

Si cela ne fonctionne toujours pas, essayez de pirater le wrapper http.

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

Cela ne va pas seulement définir l'agent utilisateur, mais aussi injecter des en-têtes supplémentaires. S'il y a un problème de traitement avec la construction de la requête dans l'encapsuleur de flux http, alors cela pourrait très bien l'attraper.

Sinon, essayez de désactiver les extensions Zend, Suhosin, PHP xdebug, APC et d'autres modules de base. Il pourrait y avoir des interférences. Sinon c'est potentiellement un problème spécifique au paquet Fedora. Essayez une nouvelle version, voir si elle persiste sur votre système.

-1

J'ai eu le même problème dans Windows après l'installation de XAMPP 1.7.7. Finalement, j'ai réussi à le résoudre en ajoutant la ligne suivante à votre php.ini (tout en ayant allow_url_fopen = On):

extension = php_openssl.dll

Questions connexes