Page 1 sur 1

file_get_contents complètement aléatoire!

Posté : 23 mai 2013, 18:06
par flyeric
Bonjour à tous,

je rencontre un problème dont je ne comprends pas l'origine.

le code suivant sert à récupérer le nombre de "j'aime" sur ma page facebook:

Code : Tout sélectionner

<?php function get_facebook_likes() { $json = file_get_contents("http://graph.facebook.com/123456789012345"); $resultat = json_decode($json, true); return $resultat["likes"]; } ?> <span style="display:inline-block; position:absolute; top:50px; left:30px;"> <?php echo get_facebook_likes(); ?> </span>
ce code fonctionne 1 fois sur 10 et lorsque il fonctionne il m'affiche bien le nombre de j'aime, en revanche, les 8 ou 9 autres fois, lorsque celà ne fonctionne pas, je reçois cette erreur:
Warning: file_get_contents(http://graph.facebook.com/123456789012345) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 403 Forbidden in ... on line 94
Je précise que je suis en asie du sud-est, est-ce que la distance et le chemin par lequel passe ma requête peut avoir un rapport avec mon problème?

lorsque je rentre dans mon navigateur ça:

Code : Tout sélectionner

http://graph.facebook.com/123456789012345
je n'ai jamais jamais d'erreur, le retour json me donne tout le temps toutes les variables relatives à la page demandée, j'en déduis donc que c'est un problème php non?

en tous les cas, je vous remercie de l'aide que vous pourriez m'apporter et je vous souhaite une bonne soirée.

Re: file_get_contents complètement aléatoire!

Posté : 23 mai 2013, 22:15
par Aureusms
Côté Php ? Je ne pense pas. L'erreur "403 Forbidden" indique que la page est interdite comme par un htaccess.
Peut être un protection pour venir récupérer trop souvent le lien?

Re: file_get_contents complètement aléatoire!

Posté : 24 mai 2013, 12:26
par flyeric
Bonjour Aureusms et bonjour à tous,

Il me semble que tu as raison.
Dès que j'espace les requêtes, ça passe mais alors si un internaute vas sur mon site et qu'il parcours plusieurs pages, vu que l'affichage du nombre de "j'aime" se trouve dans la sidebar de gauche et que cette sidebar est présente sur toutes les pages du site, au bout de la seconde ou de la troisième page, le message d'accueil va de nouveau apparaitre?

Que me conseillez vous?

Merci et bonne journée.

Re: file_get_contents complètement aléatoire!

Posté : 24 mai 2013, 12:36
par ghost5922
Bonjour,

pourquoi ne pas mettre un cache de 2 a 5 mns par exemple ?

Re: file_get_contents complètement aléatoire!

Posté : 24 mai 2013, 13:40
par Aureusms
Essaye de t'orienter vers la gestion des flux par PHP. Tu testes si c'est disponible par un flux (fonction stream & co). Si c'est disponible tu y vas, sinon tu récupères l'ancienne valeur que tu auras stocké en local sur ton site

Re: file_get_contents complètement aléatoire!

Posté : 24 mai 2013, 21:06
par flyeric
bonsoir ghost5922 et merci à toi,

Euh, pardonne-moi mais que veux-tu dire par mettre un cache de 2 à 5 minutes?

Bonsoir à toi aussi Aureusms et merci,

Si tu pouvais préciser:
Essaye de t'orienter vers la gestion des flux par PHP
Sinon effectivement, je peux stocker l'ancienne valeur en local et la réactualiser à chaque fois que je peux la lire.
En faite il me faudrait une instruction du type try/catch comme en as3, je sais que ça existe depuis php5 mais pensez-vous que je pourrais le mettre en oeuvre ici? . Essayer de récupérer les infos de facebook et mettre à jour ma variable locale et si ça plente, ne pas afficher l'erreur 403 qui met le bor... dans ma page quand elle s'affiche.

Qu'en pensez-vous?

Merci à tous les deux, bonne soirée et bonne soirée à tous.

Re: file_get_contents complètement aléatoire!

Posté : 24 mai 2013, 22:10
par moogli
Je pencherais plutôt sur ton script déclenché toute les X minutes (car suivant la politique il est possible que tu te fasse black lister en chaîne sinon).

par exemple tu stock le résultat dans un fichier, avec la date de dernière validation et avant affichage tu regarde si la date inférieur à maintenant moins la durée du cache. Dans ce cas tu utilise ton script sinon la valeur en cache.


@+

Re: file_get_contents complètement aléatoire!

Posté : 24 mai 2013, 22:44
par flyeric
Bonsoir Moogli,

Merci pour le conseil, excéllent, je vais faire comme ça.

J'ai déjà trouvé pour m'éviter d'afficher l'erreur 403, me reste plus qu'à lancer mon script de mise à jour de facebook likes si le temps écoulé depuis la dernière maj est supérieur à 5 min par exemple.

Bon je reviens avec mon script complet dès que ça fonctionne pour ceux qui pourraient être interessés dans le futur...

Bonne soirée à toi ainsi qu'à tous.

Re: file_get_contents complètement aléatoire!

Posté : 24 mai 2013, 22:45
par flyeric
Euh, plutôt que de stocker cette valeur dans un fichier, y'aurait pas moyen dans la mettre dans une simple variable sur le serveur et accessible à tous, de partout?
C'est juste un nombre qui tient sur 16 ou 24 bits... au pire!

Merci.

Re: file_get_contents complètement aléatoire!

Posté : 24 mai 2013, 23:14
par moogli
non ce n'est pas une application résidente (à la façon d'un bean application en java).
Il te faut stocker cette info quelque part et le fichier est a mon avis le plus performant (surtout que l'accès en écriture ne se fera pas souvent).


@+

Re: file_get_contents complètement aléatoire!

Posté : 24 mai 2013, 23:30
par flyeric
Merci beaucoup Moogli et bonne soirée.

Re: file_get_contents complètement aléatoire!

Posté : 25 mai 2013, 22:37
par flyeric
Bonsoir à tous,

J'ai fini et testé mon petit script (que j'ai composé en piochant à gauche et à droite), qui fonctionne correctement selon tous les critères que nous avons évoqué avant.

y'a une temporisation afin de ne pas solliciter le serveur FB trop souvent pour éviter de se faire bannir.

Pas d'erreur en cas de 403.

Je pensais que si ça peut interesser quelques internautes de passage, mettre le script, refaire un post avec un titre en rapport du genre "Récupérer un Facebook like avec temporisation" ou autre, ou vaut-il mieux le mettre dans ce post? ou peut-être simplement changer le titre?

Merci à tous et bonne soirée.

Re: [RESOLU] file_get_contents complètement aléatoire!

Posté : 25 mai 2013, 23:07
par moogli
Changer le titre et mettre le code c'est pas mal ;)

Au pire tu peux me mp si tu ne peux changer le titre je le ferais pour toi.

@+

Re: [RESOLU] file_get_contents complètement aléatoire!

Posté : 26 mai 2013, 00:04
par flyeric
Merci moogli,

Je précise d'abord que n'arrivant pas à récupérer en php5 des variables externes à une fonction dans une fonction, je les ai donc passées en paramètres...
J'en profite au passage pour demander à quelqu'un qui m'explique parceque je ne comprends pas pourquoi je ne peux pas récupérer le contenu d'une variable à l'intérieur d'une fonction si la variable a été déclarée à l'exterieur de la fonction.Avant y'avait "global' et maintenant, je ne sais pas?

Bon je reviens sur le petit script, d'abord il convient de créer un fichier qui va contenir le nombre de facebook likes (les "j'aime") et le timestamp de la dernière mise à jour du dit fichier.

on peut faire ça:
$fbLike = 1;
$fbTime = 1369517530;
$data = $fbLike . "\n" . $fbTime;
file_put_contents('fbl.txt', $data);
On vient de créer le fichier 'fbl.txt' initialisé avec 1 'j'aime' et le timestamp d'aujourd'hui à 23h05.
Pas la peine de se soucier des données entrées ci-dessus, elle se mettront à jour dès la première connexion à la page facebook ciblée.

Maintenant le petit script qui va donc afficher le nombre de "j'aime" contenu dans le fichier fbl.txt. celà si et seulement si la dernière requête a été faite il y a moins de 300 secondes (5 minutes, ce que vous pouvez changer d'ailleurs).
Si la dernière requête à eu lieu il y a plus de 5 minutes, alors on va sur la page facebook récupérer le nombre de "j'aime" et on met à jour

1) Le nombre de "j'aime" si il y a lieu,
2) Le timestamp
3) Si jamais (malgré les 5 minutes entre chaque requête réelle sur facebook) la page renvoyait un code erreur 403 ou tout autre code, alors c'est la dernière valeur contenu dans fbl.txt qui serait prise en compte sans afficher d'erreur (403 par exemple) où que se soit d'ailleurs.

Il faut remplacer le "123456789012345" par l'ID facebook désiré.
<div class="socialFacebookIcon">
						<?php
							$readFbl = file_get_contents('fbl.txt');
							list($fbLike, $fbTime) = explode("\n", $readFbl);
							$realTime = time();
														
							$url = "http://graph.facebook.com/123456789012345";
							
							function get_facebook_likes($receiveUrl,$fbLike,$fbTime,$realTime)
							{ 
								if ($realTime - $fbTime >= 300)
								{
									$ch = curl_init(); 
									curl_setopt($ch, CURLOPT_URL, $receiveUrl); 
									curl_setopt($ch, CURLOPT_HEADER, TRUE); 
									curl_setopt($ch, CURLOPT_NOBODY, TRUE); 
									curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
									$head = curl_exec($ch); 
									$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
									curl_close($ch); 

									if ($httpCode == "200")
									{
										$json     = file_get_contents("http://graph.facebook.com/123456789012345");
										$result = json_decode($json, true);
										
										$fbTime = $realTime;
										$data = $result["likes"] . "\n" . $fbTime;
										file_put_contents('fbl.txt', $data);

										return $result["likes"];
									}
									else
									{
										return $fbLike;
									}
								}
								else
								{
									return $fbLike;
								}
							}
						?>
						<span style="text-align:center;">
							<?php	echo get_facebook_likes($url,$fbLike,$fbTime,$realTime); ?>
						</span>
						<a href="http://www.facebook.com/pages/LeNomDeLaPage/123456789012345" target="_blank">
							<img src="/images/facebookNew.png" alt="suivez nous sur Facebook" border="0px"/>
						</a>
					</div>
Je précise qu'il n'y a pas besoin d'api facebook et que ça marche sur n'importe quel compte facebook dont vous avez l'Id.

En espérant que ça servira à certains.

Bonne nuit à tous.