سؤال

لدي أحد المواقف "أقسم أنني لم ألمس الخادم".أنا بصراحة لم أتطرق إلى أي من نصوص php.المشكلة التي أواجهها هي أنه لا يتم حفظ بيانات php عبر صفحات مختلفة أو عمليات تحديث الصفحة.أعلم أنه يتم إنشاء جلسة جديدة بشكل صحيح لأنه يمكنني تعيين متغير الجلسة (على سبيل المثال.$_SESSION['foo'] = "foo" ثم قم بطباعته مرة أخرى على نفس الصفحة بشكل جيد.ولكن عندما أحاول استخدام نفس المتغير في صفحة أخرى، لم يتم تعيينه!هل هناك أي وظائف أو معلومات PHP يمكنني استخدامها على خادم المضيفين لمعرفة ما يجري؟

فيما يلي مثال لبرنامج نصي لا يعمل على خادم مضيفي حتى الآن:

<?php
session_start();
if(isset($_SESSION['views']))
    $_SESSION['views'] = $_SESSION['views']+ 1;
else
    $_SESSION['views'] = 1;

echo "views = ". $_SESSION['views'];
echo '<p><a href="page1.php">Refresh</a></p>';
?>

لا تتم زيادة متغير "طرق العرض" أبدًا بعد تحديث الصفحة.أعتقد أن هذه مشكلة من جانبهم، لكني أردت التأكد من أنني لست أحمقًا تمامًا أولاً.

إليك phpinfo() لخادم المضيفين (إصدار PHP 4.4.7):alt text

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

المحلول

وشكرا لجميع المعلومات المفيدة. وتبين أن مضيفي تغير الخوادم وبدأت باستخدام جلسة عمل مختلفة حفظ مسار آخر من / فار / php_sessions التي لم تكن موجودة بعد الآن. ومن شأن الحل كانت لاعلان ini_set(' session.save_path','SOME WRITABLE PATH'); في كافة ملفات مخطوطتي ولكن هذا كان يمكن أن يكون الألم. لقد تحدثت مع المضيف وضعوا صراحة مسار الدورة إلى مسار الحقيقي التي كانت موجودة. نأمل أن يساعد أي شخص وجود مشاكل مسار الدورة.

نصائح أخرى

وتحقق للتأكد من انك لم خلط HTTPS: // ب http: //. متغيرات جلسة لا تتدفق بين جلسات آمنة وغير آمنة.

وكان نفس المشكلة - ما حدث بالنسبة لي هو لدينا المشرف الخادم تغير منطقية session.cookie_secure على تشغيل، وهو ما يعني أن ملفات تعريف الارتباط وسوف ترسل فقط عبر اتصال آمن. حيث لم يتم العثور على ملفات تعريف الارتباط، ووردبريس وخلق دورة جديدة في كل مرة، وبالتالي لم ينظر المتغيرات الدورة.

استخدم phpinfo() والتحقق من إعدادات session.*.

وربما يتم تخزين المعلومات في الكوكيز ومتصفحك لا يقبل الكوكيز، شيء من هذا القبيل.

وتأكد من أن أولا ونعود مع النتائج.

ويمكنك أيضا القيام print_r($_SESSION); لتفريغ هذا المتغير ورؤية المحتوى ....

وفيما يتعلق phpinfo() الخاص بك، هو session.save_path واحد صحيح؟ هل خادم الويب الخاص بك لديها حق الوصول إلى هذا الدليل؟

وآمل أن يساعد هذا.

وكنت قد التالية مشكلة

وindex.php

<?
    session_start();
    $_SESSION['a'] = 123;
    header('location:index2.php');
?>

وindex2.php

<?
  session_start();
  echo $_SESSION['a'];
?>

ولم يتم تعيين $_SESSION['a'] متغير بشكل صحيح. ثم لقد غيرت index.php acordingly

<?
    session_start();
    $_SESSION['a'] = 123;
    session_write_close();
    header('location:index2.php');
?>

وأنا لا أعرف ماذا يعني هذا داخليا، وأنا مجرد شرح ذلك لنفسي أن التغيير متغير جلسة لم يكن سريعا بما فيه الكفاية:)

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

تأكد من حصولك على تشغيل ملفات تعريف الارتباط .. (أنسى عندما كنت إيقاف تشغيلها لاختبار شيء)

استخدم فايرفوكس مع التمديد الحرائق لمعرفة ما إذا كان يتم تعيين ملف تعريف الارتباط وتنتقل إلى الخلف.

وعلى مذكرة لا علاقة لها، تبدأ في النظر في PHP5، لأن فب 4.4.9 هو آخر من سلسلة PHP4.

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

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

if (isset($_SESSION['views'])) {
    if (!is_numeric($_SESSION['views'])) {
        echo "CRAP!";
    }
    ++$_SESSION['views'];
} else {
    $_SESSION['views'] = 1;
}

حسنًا، يمكننا التخلص من خطأ الكود لأنني قمت باختبار الكود على خادمي الخاص (PHP 5).

إليك ما يجب التحقق منه:

  1. هل تتصل بـ session_unset() أو session_destroy() في أي مكان؟ستقوم هذه الوظائف بحذف بيانات الجلسة على الفور.إذا وضعت هذه في نهاية النص الخاص بي، فسيبدأ بالتصرف تمامًا كما وصفته.

  2. هل يعمل بنفس الطريقة في جميع المتصفحات؟إذا كان يعمل على متصفح واحد دون آخر، فقد تكون لديك مشكلة في التكوين على المتصفح الذي لا يعمل (أي متصفح لا يعمل).لقد قمت بإيقاف تشغيل ملفات تعريف الارتباط ونسيت تشغيلها، أو تقوم بحظر ملفات تعريف الارتباط عن طريق الخطأ).

  3. هل مجلد الجلسة قابل للكتابة؟لا يمكنك اختبار ذلك باستخدام is_writable()، لذا ستحتاج إلى الانتقال إلى المجلد (من phpinfo() يبدو مثل /var/php_sessions) والتأكد من إنشاء الجلسات فعليًا.

إذا قمت بتعيين جلسة في PHP5، ثم محاولة لقراءته على صفحة PHP4، فإنه قد لا تبدو في المكان الصحيح! جعل صفحات نفس الإصدار فب أو تعيين session_path.

وقضيت الأعمار عن الجواب لمشكلة مماثلة. لم يكن مشكلة مع رمز أو الإعداد، كما عملت رمز مشابهة جدا تماما في فب آخر على نفس الخادم. تبين المشكلة كان سببها كمية كبيرة جدا من البيانات التي يتم حفظها في الدورة في هذه الصفحة. في مكان واحد كان لدينا مثل هذا الخط: $_SESSION['full_list'] = $full_list حيث كان $full_list مجموعة من تحميل البيانات من قاعدة البيانات؛ كان كل صف مجموعة من نحو 150 عناصر. عندما تم كتابة التعليمات البرمجية في البداية بضع سنوات مضت، الواردة في DB فقط حوالي 1000 الصفوف، وبالتالي فإن $full_list يحتوي على نحو 100 عناصر، ويجري كل مجموعة من حوالي 20 عنصرا. مع مرور الوقت، تحولت العناصر 20 إلى 150، واتجهوا 1000 الصفوف إلى 17000، وبالتالي فإن الشفرة قد تم تخزين ما يقرب من 64 ميج من البيانات في الدورة. على ما يبدو، مع هذه الكمية من البيانات التي يتم تخزينها، رفضت لتخزين أي شيء آخر. مرة واحدة قمنا بتغيير رمز للتعامل مع البيانات محليا دون حفظه في الدورة، عملت كل شيء تماما.

<اقتباس فقرة>   

وأنا أعلم حل واحد وجدت (OSX مع اباتشي 1 وتحولت لمجرد PHP5) عندما كان لي مشكلة مماثلة كان أن unsetting 1 مفتاح معين (أي إلغاء تعيين ($ _ الدورة [ 'مفتاح'])؛) وقد تسبب ذلك لا للحفظ. في أقرب وقت لم أكن إلغاء تعيين هذا المفتاح أي أكثر من حفظه. أنا لم أر هذا مرة أخرى، إلا على ذلك الملقم على موقع آخر، ولكن بعد ذلك كان متغير مختلف. لا هم أي شيء خاص.

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

وأنا أعلم حل واحد وجدت (OSX مع اباتشي 1 وتحولت لمجرد PHP5) عندما كان لي مشكلة مماثلة كان أن unsetting 1 مفتاح معين (أي إلغاء تعيين ($ _ الدورة [ 'مفتاح'])؛) وقد تسبب ذلك لا للحفظ. في أقرب وقت لم أكن إلغاء تعيين هذا المفتاح أي أكثر من حفظه. أنا لم أر هذا مرة أخرى، إلا على ذلك الملقم على موقع آخر، ولكن بعد ذلك كان متغير مختلف. لا هم أي شيء خاص.

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

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

وكان لي جلسة مسار ملف تعريف الارتباط لتعيين "//" بدلا من "/". الحرائق رائع. آمل أن يساعد شخص ما.

وكان لي هذه المشكلة عند استخدام الصفحات الآمنة حيث كنت قادما من www.domain.com/auth.php أن إعادة توجيهها إلى domain.com/destpage.php. I إزالة www من رابط auth.php وأنه يعمل. ألقى هذا لي لعملت كل شيء خلاف ذلك؛ والدورة لم يتم تغيير عندما وصلت إلى الوجهة بالرغم من ذلك.

وثمة مسألة شائعة كثيرا ما يغفل أيضا أنه يجب أن يكون هناك أي قانون آخر أو تباعد إضافي قبل الأمر session_start ().

ولقد كان هذا الموضوع من قبل حيث كان سطر فارغ قبل session_start () الذي تسبب في عدم العمل بشكل صحيح.

إضافة الحل الخاص بي:

تحقق مما إذا كان يمكنك الوصول إلى المجال الصحيح.كنت أستخدم www.mysite.com لبدء الجلسة، وحاول الحصول عليها من mysite.com (بدون ال www).

لقد قمت بحل هذه المشكلة عن طريق إضافة إعادة كتابة htaccess لجميع المجالات إلى www لتكون في الجانب/الموقع الآمن.

تحقق أيضًا مما إذا كنت تستخدم http أو https.

وتحرير ملف php.ini الخاص بك.
أعتقد أن قيمة session.gc_probability 1، حتى تعيينها إلى 0.

session.gc_probability=0

وتحقق مما إذا كنت تستخدم session_write_close ()؛ في أي مكان، وكان يستخدم هذا الحق بعد جلسة أخرى ثم محاولة الكتابة إلى الدورة مرة أخرى، وأنها لا تعمل .. حتى مجرد التعليق الذي ش ر * من

وقليل من الأشياء الأخرى اضطررت الى القيام به (وكان لي نفس المشكلة: لا الاحتفاظ sesson بعد PHP الترقية إلى 5.4). كنت كثير لا تحتاج هذه، اعتمادا على ما يحتوي على ملف php.ini الخادم الخاص بك (تحقق phpinfio ())؛

session.use_trans_sid=0 ; Do not add session id to URI (osc does this)
session.use_cookies=0;  ; ensure cookies are not used
session.use_only_cookies=0 ; ensure sessions are OK to use IMPORTANT
session.save_path=~/tmp/osc; ; Set to same as admin setting
session.auto_start = off; Tell PHP not to start sessions, osc code will do this

والأساس، ويجب تعيين ملف php.ini الخاص بك إلى أي الكوكيز، ويجب أن يكون المعلمات جلسة يتفق مع ما يريده مكتب المنسق الخاص.

وأنت قد تحتاج أيضا إلى تغيير بعض مقتطفات الشفرة جلسة في application_top.php - إنشاء كائنات حيث لا توجد في tep_session_is_registered (...) يدعو (ه مثل الكائن الملاحة)، تعيين $ المتغيرات HTTP_ إلى أحدث _SERVER $ منها وعدد قليل من الاختبارات isset للكائنات فارغة (جوجل لمزيد من المعلومات). انتهى بي الأمر أن تكون قادرة على استخدام الملفات sessions.php الأصلي (ويشمل / الطبقات ويشمل / وظائف) مع application_top.php معدلة بشكل طفيف للحصول على الأشياء تسير مرة أخرى. كانت إعدادات PHP.INI المشكلة الرئيسية، ولكن هذا بالطبع يعتمد على ما قامت بتركيب شركة الخادم الخاص بك كما الإعدادات الافتراضية.

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