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.
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
@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() –
Pour quelle URL spécifique cela ne fonctionne-t-il pas? – mario