هل تنفذ PHPs وظيفة الدالة fopen نوع من ذاكرة التخزين المؤقت؟

StackOverflow https://stackoverflow.com/questions/511476

  •  21-08-2019
  •  | 
  •  

سؤال

وأنا أعاني مع جمع البيانات آليا من السيناريو PHP من خادم ويب. الملفات في مسألة تحتوي على بيانات الأرصاد الجوية وويتم تحديثها كل 10 دقيقة. بغرابة بما فيه الكفاية، و"ملف تعديل" التاريخ على خادم الويب لا يتغير.

الدالة fopen (ومن "http: // ... ') -command يحاول الحصول على الطازجة نسخة من الملف الأخير في هذا الدليل كل ساعة. ولكن بانتظام أنا في نهاية المطاف مع نسخة ما يصل إلى 4 ساعات من العمر. يحدث هذا على خادم لينكس التي (كما أكد مسؤول النظام بلدي لي) لا يستخدم الملقم الوكيل من أي نوع.

هل تنفذ PHP آلية التخزين المؤقت الخاصة بها؟ أو ماذا يمكن أن يكون التدخل هنا؟

و(بلدي الحل الحالي هو للاستيلاء على الملف عبر إكسيك ( 'مجلد مشترك --nocache ...') الذي يعمل).

هل كانت مفيدة؟

المحلول

ومنذ كنت الحصول على الملفات عبر HTTP، أفترض أن PHP سيتم تكريم أي رؤوس مخبأ خادم يستجيب مع.

وهناك طريقة بسيطة جدا وقذرة لتجنب ذلك هو لإلحاق بعض المعلمة الحصول عشوائية لكل طلب.

نصائح أخرى

ووQ المتعلقة التخزين المؤقت المرصود من المحتويات الوصول إليها من قبل الدالة fopen (من "http: // ... ') والملصق وتساءل عما إذا PHP تنفيذ آلية التخزين المؤقت الخاصة بها؟ وتضمنت إجابات أخرى بعض التكهنات، ولكن من المؤكد أن أسهل طريقة لمعرفة أن تحقق من خلال النظر في شفرة المصدر أو ربما أسهل instrumenting يدعو النظام لمعرفة ما الذي يجري؟ هذا هو تافهة للقيام على أنظمة ديبيان كما يلي:

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

ولقد تضمنت استخراج ذي الصلة من سجل strace أدناه ولكن هذا ما يظهر هو في PHP RTS يربط ببساطة على مضيف محلي: 80 ، أو يرسل "GET /xx.txt"، ويحصل على استجابة تضم رؤوس ومحتوى الملف الذي ثم يردد لSTDOUT.

وقطعا لم يحدث التخزين المؤقت من جانب العميل داخل PHP RTS، ولأن هذا هو فعل حوار مباشر مأخذ HTTP، فمن الصعب أن نتصور حيث يمكن أن يحدث التخزين المؤقت على العميل. نحن مع اليسار إمكانية من جانب الخادم أو وسيط التخزين المؤقت الوكيل. (ملاحظة I الافتراضي لتنتهي من الوصول + 7 أيام على ملفات TXT).

استخراج ملف السجل

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

وحتى لو كنت أنا فهم بشكل صحيح، جزء من المشكلة قد يكون أن * دات ملف دائما طابع زمني من 1:00؟ هل لديك السيطرة على الملقم الذي يحتوي على البيانات (http://www.iac.ethz.ch/php/chn_meteo_roof/)؟ إذا كان الأمر كذلك، يجب أن تحاول معرفة السبب لديه بيانات دائما نفس الطابع الزمني. لدي للاعتقاد يتم تعيينها عمدا - سوف OS تحديث الطابع الزمني عندما يتم تعديل الملف إلا إذا كنت الخروج من طريقك لجعله لا تفعل ذلك. إذا لم تتمكن من معرفة لماذا يتم تعيين إلى 1:00، هل يمكن على الأقل القيام ب "لمس" الأوامر على الملف، والذي سيتم تحديث انها معدلة الطابع الزمني.

وهذا هو كل شيء، بالطبع، على افتراض انك تستطيع الحصول على بعض خادم توفير الملفات.

لماذا لا تحاول استخدام حليقة ، وأنا أعتقد أن هذا هو الاستخدام الأكثر مناسبة لذلك.

وربما هذا يمكن حل المشكلة (طلب وظيفة لا يمكن أن يكون مؤقتا حتى ما أعرف)

$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);
*/
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top