PHP التخزين المؤقت دون العبث مع أذونات الملف (أيضا كيف لمحاكاة تطبيق ASP المتغيرات في PHP)

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

سؤال

أنا أحاول لتنفيذ بعض نوع من التخزين المؤقت في السيناريو PHP التي سوف تذهب إلى العديد من العملاء المختلفة/المواقع التي سيتم نشرها من قبل إلى حد ما المستخدمين غير التقنيين ، وذلك باستخدام مجموعة متنوعة من المضيفين على الشبكة.بسبب عدم الطبيعة التقنية من المستخدمين ، أود أن تجنب يطلب منهم قرص أذونات الملف.التخزين المؤقت يجب أن يكون عبر جلسات ، وذلك باستخدام متغيرات جلسة العمل في الخارج.إذا كنت الترميز هذا في ASP كنت تستخدم تطبيق المتغيرات ، ولكن لم تكن موجودة في PHP (على حد علمي)

هل من أحد لديه أي اقتراحات بشأن كيفية تحقيق ذلك ؟

هنا هي بعض الاحتمالات التي فكرت أي تعليقات على هذه المفيد:

  • التخزين المؤقت عن طريق الملفات في temp النظام مجلدات - يمكنني استخدام sys_get_temp_dir() (أو في بعض البيت توالت وظيفة مماثلة على PHP4) للمساعدة في العثور على هذا المجلد.العيب هنا هو أنه ربما لن تعمل على المضيفين باستخدام openbase_dir قيود
  • بعض المواقع نظرت ذكر خداع PHP في صنع جميع جلسات عمل المستخدم مشاركة نفس الدورة الدولة وبالتالي إجبار متغيرات جلسة العمل إلى العمل مثل دورة المتغيرات.بالطبع لا أستطيع أن أجد بعد الآن...هذا يبدو مخيفا على كل حال.(سوف أقوم بتحديث هذا السؤال مع رابط إلى هذا المنصب مرة واحدة العثور عليه مرة أخرى)
  • استخدام طرف ثالث مخزن البيانات مثل أمازون خدمة التخزين بسيطة - يبدو مبالغة
  • ذاكرة التخزين المؤقت البيانات على الخادم ، ويكون العميل تحميل البيانات الجديدة من هناك على كل ضرب.

مرة أخرى, أي تعليقات على هذه الأفكار أو أي جديدة سيكون موضع تقدير.

تحديث: حاولت استخدام session_id drop() لاستخدام مشترك جلسة الدولة, لكنه لا يعمل.كل دورة هو المحافظة على "GlobalCache" ، أي أفكار لماذا؟:

// This code doesn't work, but the similar code in my answer does!

function test() {
    if (!$_SESSION['session_count']) $_SESSION['session_count'] = 0;
    $_SESSION['session_count']++;


    $count = get_cache( 'count' );

    print "pre application count: $count<br>";

    if ( !$count )
        $count = 0;

    $count++;

    print "session_id: " . session_id() . "<br>";
    print "post application count: $count<br>";
    print "session_count: " . $_SESSION['session_count'] . "<br>";

    set_cache('count', $count);
}


function set_cache( $name, $value ) {
    $old_session = session_id();
    print "old_session (set): $old_session<br>";

    session_id("GlobalCache");
    print "new_session (set): " . session_id() .  "<br>";

    $_SESSION[$name] = $value;
    session_id( $old_session );
}

function get_cache( $name ) {
    $old_session = session_id();
    print "old_session (get): $old_session<br>";

    session_id("GlobalCache");
    print "new_session (get): " . session_id() .  "<br>";

    $value = $_SESSION[$name];
    session_id( $old_session );
    return $value;
}

session_start();
test();

تحديث: وقد اقترح البعض استخدام أعطها ، والتي هي في الواقع حلا رائعا بالنسبة للبعض ، ولكن منذ أن كنت لا تملك السيطرة على خادم البيئة ليس خيارا.والفكرة هي أن يكون السيناريو الذي يمكن للناس فقط FTP إلى حساب الاستضافة المشتركة التي تعمل فقط في الخروج من مربع.

تحديث: اقترح شخص ما خلق بلدي مجلد التخزين المؤقت مع البرنامج النصي ولكن لا تحتاج إلى إنشاء هذا المجلد داخل مجلد بالفعل كتابة الأذونات ؟

التحديث حل وجدت: لقد انتهى الأمر في معرفة مشاكل في الدورة العالمية النصي قد نشرت بلدي الإجابة على هذا التأثير.شكرا على مساعدة الجميع.

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

المحلول

حسنا, عرفت كيف نفعل هذا من خلال محاكاة ASP-تطبيق أسلوب المتغيرات باستخدام مشتركة/العالمية حالة جلسة العمل.اثنين من التغييرات الرئيسية من رمز غير العاملة في التحديث:

  1. للتبديل الدورة الدولة ، يجب أن نهاية الدورة الحالية في التحول إلى واحدة جديدة ، ثم تشغيله.لقد تجسدت هذه العملية في switch_session()

  2. وبما أننا التحول معرفات الجلسات في جميع أنحاء علينا أن العازلة الصفحة الإخراج باستخدام الميزانية سان فرانسيسكو. ()/ob_end_flush() بحيث الكوكيز لا يتم إرسالها في وقت قريب جدا.

الكامل العامل رمز يلي (تنظيف أيضا!).هذا يمكن أن يكون بسهولة اختبارها من قبل تحميل الصفحة في إنترنت إكسبلورر و فايرفوكس نافذة ، وإعادة كل عدة مرات لمشاهدة عدادات الارتفاع:

<?php
function test() {

    // Do a regular session count
    print "session_id: " . session_id() . "<br>";
    if (!$_SESSION['session_count']) $_SESSION['session_count'] = 0;
    $_SESSION['session_count']++;
    print "session count: " . $_SESSION['session_count'] . "<br>";


    // Do an application count
    $count = get_cache( 'count' );
    if ( !$count ) $count = 0;
    $count++;
    print "application count: $count<br>";
    set_cache('count', $count);
}


function set_cache( $name, $value ) {
    $old_session = switch_session("GlobalCache");
    $_SESSION[$name] = $value;
    switch_session( $old_session );
}

function get_cache( $name ) {
    $old_session = switch_session("GlobalCache");
    $value = $_SESSION[$name];
    switch_session( $old_session );
    return $value;
}

function switch_session( $session_id ) {

    // switch the session and return the original
    $old_id = session_id();

    session_write_close();
    session_id($session_id);
    session_start();
    return $old_id;
}

ob_start();
session_start();
test();
ob_end_flush();
?>

نصائح أخرى

هل يمكن استخدام دورات ثابتة الدورة الرئيسية.

http://de.php.net/manual/en/function.session-id.php:

session_id drop([id]) المستخدمة في الحصول على أو تعيين الدورة id للدورة الحالية.إذا كان معرف تحديد محل الدورة الحالية الهوية.session_id drop() يجب أن يكون قبل session_start() لهذا الغرض.

استخدام الخاص بك ذاكرة التخزين المؤقت dir في التطبيق الخاص بك dir.وبذلك لا تضطر إلى النضال مع مختلف الخادم و/أو إعدادات PHP و اضمن أفضل قابلية.

أنا أصوت ل "ذاكرة التخزين المؤقت البيانات على الخادم ، ويكون العميل تحميل البيانات الجديدة من هناك على كل ضرب."

جميع الطرق تؤدي إلى بعض الجنون.

تحقق أعطها php - أنه يعمل بشكل جيد حقا.

http://www.php.net/memcache

أنا استخدم وظيفة محدثة من قبل المؤلف باعتباره الطريق إلى ذاكرة التخزين المؤقت بيانات بسيطة نتيجة الاستعلام منذ كنت أتوقع تحميل عالية.أنا أيضا تخزين زمني بحيث يمكن أن تحدد كيف في كثير من الأحيان الصفحة سوف تجديد قاعدة بيانات النتيجة بدلا من مجرد أخذ القيمة المخزنة مؤقتا.

أستطيع أن أقول لكم أن هذه وظيفة ذاكرة التخزين المؤقت قد بكثير أداء أسوأ بكثير من الذهاب مباشرة إلى قاعدة البيانات في كل طلب.أنا فعلا قتل الخادم.مرة واحدة تحولت إلى مجرد الاستعلام عن قاعدة بيانات الخادم حصلت على ما يصل إلى كامل بسرعة كبيرة جدا تحميل يكن حتى لاحظت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top