PHPs fopen fonksiyonu önbellek çeşit uygulamak mı?

5 Cevap php

Ben bir web sunucusu bir PHP komut dosyası otomatik veri toplama ile mücadele ediyorum. The files in question meteorolojik verileri içeren ve her 10 dakikada bir güncellenmektedir. Esrarlı yeterli, web sunucusu üzerinde 'dosya değiştirilme' tarih değişmez.

Basit bir fopen ('http:// ...')-komutu bu dizinde son dosyanın taze sürümünü saatte almaya çalışır. Ama düzenli olarak ben 4 saat eski bir sürüm up ile sonuna kadar. Bu (benim sistem yöneticisi bana güvence olduğu gibi) her türlü proxy sunucusu kullanmak olmayan bir Linux sunucu üzerinde olur.

PHP kendi önbelleğe alma mekanizması uyguluyor mu? Ya da başka ne burada karışıyor olabilir?

(Benim şu anki geçici exec (vasıtasıyla dosyayı kapmak için 'wget - nocache ...') çalıştığı.)

5 Cevap

HTTP üzerinden dosya alıyoruz beri, ben PHP sunucu ile yanıt herhangi bir önbellek başlıklarını onurlandıran olacağını varsayarak yaşıyorum.

Bunu önlemek için çok basit ve kirli bir şekilde her istek için bazı rasgele get parametresi eklemektir.

Seni doğru anlama ediyorum Yani, sorunun parçası *. Dat dosyası her zaman 1:00 bir zaman damgası var olabilir? Eğer verileri içeren sunucunun kontrol var mı (http://www.iac.ethz.ch/php/chn_meteo_roof/)? Eğer öyleyse, veriler her zaman aynı zaman damgası var neden bulmaya çalışmalısınız. Ben kasıtlı ayarlanır ediliyor inanmak zorunda - bunu yapmak değil yapmak için kendi yolumdan gitmek sürece dosya değiştirildiğinde OS damgası güncelleyecektir. Bu 1:00 ayarlı neden anlamaya yapamıyorsanız, en azından damgası Modifiye güncelleme, hangi dosya üzerinde bir "dokunuş" komutunu yapabilirdi.

Bu dosyaları sağlayan sunucuya bazı erişim varsayarak, tabii ki, hepsi bu.

Gözlenen bir fopen ('http:// ...') tarafından erişilen içeriğin önbelleğe alma ve posteri ile ilgili Q PHP kendi önbelleğe alma mekanizması uygulamak olmadığını merak ettiniz mi? Diğer cevaplar bazı spekülasyonlar dahil, ama kesinlikle öğrenmek için en kolay yolu, sistem üzerinde ne olup bittiğini görmek için çağırır instrumenting kaynak koduna bakarak ya da belki daha kolay tarafından kontrol etmektir? Bu, aşağıdaki gibi Debian sistemlerinde yapmak saçmadır:

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

Ben aşağıda strace günlüğünün ilgili özü dahil ama ne bunu göstermektedir PHP RTS sadece, localhost:80 bağlayan bir "GET / xx.txt" gönderir, başlıkları ve dosya içeriğini içeren bir yanıt alır olduğunu ettik ki bu daha sonra STDOUT yankıları.

Kesinlikle hiçbir istemci tarafında önbelleğe alma PHP RTS içinde gerçekleşir ve bu doğrudan HTTP soket diyaloğu yapıyor beri, bu önbelleğe alma istemci üzerinde meydana geldiği tasavvur etmek zordur. Biz sunucu tarafında veya ara proxy önbelleğe alma olasılığı kalır. (Ben bir txt dosyaları Access + 7 gün sona varsayılan Not).

Logfile Extract

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

neden kullanmayı deneyin Yüklü curl, ben bu için daha doğru bir kullanım olduğunu düşünüyorum.

belki bu (POST isteği kadarıyla biliyorum önbelleğe olamaz) sorununuzu çözebilirsiniz

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