Question

Je suis aux prises avec la collecte automatisée de données d'un script PHP à partir d'un serveur Web. Les fichiers en question contiennent des données et sont mis à jour meteo toutes les 10 minutes. Bizarrement, la date « du fichier modifié » sur le serveur Web ne change pas.

Un simple fopen ( 'http: // ...) -command tente d'obtenir de la dernière version du dernier fichier dans ce répertoire toutes les heures. Mais régulièrement, je finis avec une version jusqu'à 4 heures vieux. Cela se produit sur un serveur Linux qui (comme mon administrateur système m'a assuré) ne pas utiliser un serveur proxy d'aucune sorte.

Est-ce que PHP mettre en œuvre son propre mécanisme de mise en cache? Ou quoi d'autre pourrait interférer ici?

(Ma solution actuelle est de saisir le fichier via exec ( 'wget --nocache ...) qui fonctionne.)

Était-ce utile?

La solution

Depuis que vous obtenez le fichier via HTTP, je suppose que PHP honorera les en-têtes de cache du serveur répond avec.

Une façon très simple et sale pour éviter qui est d'ajouter un paramètre get aléatoire à chaque demande.

Autres conseils

Le Q lié à la mise en cache observée contenu accessible par un fopen ( 'http: // ...) et l'affiche se demande si PHP mettre en œuvre son propre mécanisme de mise en cache? Les autres réponses comprenaient des spéculations, mais sûrement la meilleure façon de le savoir est de vérifier en regardant le code source ou peut-être plus facile instrumenter le système appelle pour voir ce qui se passe? Ceci est trivial à faire sur les systèmes Debian comme suit:

$ echo "Hello World" > /var/www/xx.txt
$ strace -tt -o /tmp/strace  \
> php -r 'echo file_get_contents("http://localhost/xx.txt");'
Hello World

J'ai inclus l'extrait pertinent du journal de strace ci-dessous, mais cela montre est le RTS PHP se connecte simplement à localhost: 80 , envoie un « GET /xx.txt », obtient un réponse comprenant des en-têtes et le contenu du fichier auquel il résonne alors à STDOUT.

Absolument pas mise en cache côté client se produit au sein de la RTS PHP, et que ce fait le dialogue socket HTTP direct, il est difficile d'imaginer où la mise en cache pourrait se produire sur le client. Il nous reste la possibilité de côté serveur ou la mise en cache de proxy intermédiaire. (Note I par défaut à un expires d'accès + 7 jours sur les fichiers txt).

Extrait du fichier journal

00:15:41.887904 socket(PF_INET6, SOCK_STREAM, IPPROTO_IP) = 3
00:15:41.888029 fcntl(3, F_GETFL)       = 0x2 (flags O_RDWR)
00:15:41.888148 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
00:15:41.888265 connect(3, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "::1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINPROGRESS (Operation now in progress)
00:15:41.888487 poll([{fd=3, events=POLLIN|POLLOUT|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=3, revents=POLLOUT}])
00:15:41.888651 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
00:15:41.888838 fcntl(3, F_SETFL, O_RDWR) = 0
00:15:41.888975 sendto(3, "GET /xx.txt HTTP/1.0\r\n", 22, MSG_DONTWAIT, NULL, 0) = 22
00:15:41.889172 sendto(3, "Host: localhost\r\n", 17, MSG_DONTWAIT, NULL, 0) = 17
00:15:41.889307 sendto(3, "\r\n", 2, MSG_DONTWAIT, NULL, 0) = 2
00:15:41.889437 poll([{fd=3, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)
00:15:41.889544 poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=3, revents=POLLIN}])
00:15:41.891066 recvfrom(3, "HTTP/1.1 200 OK\r\nDate: Wed, 15 F"..., 8192, MSG_DONTWAIT, NULL, NULL) = 285
00:15:41.891235 poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=3, revents=POLLIN}])
00:15:41.908909 recvfrom(3, "", 8192, MSG_DONTWAIT, NULL, NULL) = 0
00:15:41.909016 poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=3, revents=POLLIN}])
00:15:41.909108 recvfrom(3, "", 8192, MSG_DONTWAIT, NULL, NULL) = 0
00:15:41.909198 close(3)                = 0
00:15:41.909323 write(1, "Hello World\n", 12) = 12
00:15:41.909532 munmap(0x7ff3866c9000, 528384) = 0
00:15:41.909600 close(2)                = 0
00:15:41.909648 close(1)                = 0

Donc, si je vous comprends bien, une partie du problème pourrait être que le fichier * .dat a toujours un horodatage de 01h00? Avez-vous le contrôle du serveur contenant les données (http://www.iac.ethz.ch/php/chn_meteo_roof/)? Si oui, vous devriez essayer de savoir pourquoi les données a toujours le même horodatage. Je dois le croire est mis volontairement - le système d'exploitation mettra à jour l'horodatage lorsque le fichier est modifié, sauf si vous sortez de votre façon de le faire pas le faire. Si vous ne pouvez pas comprendre pourquoi il est mis à 1h du matin, vous pourriez au moins faire une commande « toucher » sur le fichier, qui mettra à jour il est timestamp modifié.

Ceci est tout, bien sûr, en supposant que vous avez un accès au serveur fournissant les fichiers.

pourquoi ne pas essayer d'utiliser boucle , je pense que cela est une utilisation plus appropriée pour cela.

peut-être cela peut résoudre votre problème (requête POST ne peut pas être mis en mémoire cache jusqu'à je sais)

$opts = array('http' =>
  array(
    'method'  => 'POST',
    'content'=>''
  )
);
$context  = stream_context_create($opts);
$resource = fopen ('http://example.com/your-ulr', 'r', false, $context);

/* or you can use file_get_contents to retrieve all the file 
   $fileContent = file_get_contents('http://example.com/your-ulr', false, $context);
*/
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top