2008-10-01 15 views
55

मेरे पास उनमें से एक है "मैं कसम खाता हूं कि मैंने सर्वर को स्पर्श नहीं किया" स्थितियों में से एक है। मैंने ईमानदारी से किसी भी 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>'; 
?> 

के विचारों 'चर कभी नहीं एक पृष्ठ ताज़ा करने के बाद वृद्धि होने पर मैं सोच रहा हूँ कि यह उनके पक्ष में एक समस्या है, लेकिन मुझे यकीन है कि मैं एक पूर्ण बेवकूफ पहले नहीं कर रहा हूँ बनाना चाहते थे।।

यहाँ मेरी मेजबान 'सर्वर (PHP संस्करण 4.4.7) के लिए phpinfo() है: alt text

+0

अपनी लाइन प्रतिबिंबित करने का प्रयास करें '

Refresh

'; हेडर ('स्थान: http: //'$$ERVER [' HTTP_HOST ']।'page1.php') के साथ; –

उत्तर

41

सभी सहायक जानकारी के लिए धन्यवाद। यह पता चला है कि मेरे होस्ट ने सर्वर बदल दिए हैं और/var/php_sessions के अलावा पथ को सहेजने के लिए एक अलग सत्र का उपयोग करना शुरू किया जो अब मौजूद नहीं था। मेरी सभी स्क्रिप्ट फ़ाइलों में ini_set(' session.save_path','SOME WRITABLE PATH'); घोषित करने का एक समाधान होता था लेकिन यह दर्द होता। मैंने मेजबान से बात की और वे स्पष्ट रूप से सत्र पथ को एक वास्तविक रास्ते पर सेट कर चुके थे जो अस्तित्व में था। उम्मीद है कि यह सत्र पथ परेशानियों में से किसी को भी मदद करता है।

+1

क्या आप कोड लाइन का उदाहरण दे सकते हैं? – Steeven

+0

बहुत बहुत धन्यवाद! आकर्षण की तरह काम करता है! – raBne

7

उपयोग phpinfo() और session.* सेटिंग्स की जाँच करें।

शायद जानकारी कुकीज़ में संग्रहीत की जाती है और आपका ब्राउज़र कुकीज स्वीकार नहीं करता है, ऐसा कुछ।

पहले इसे जांचें और परिणामों के साथ वापस आएं।

इस चर का एक डंप है और सामग्री देखने के लिए print_r($_SESSION); कर सकते हैं ....

अपने phpinfo() के बारे में, session.save_path एक वैध एक है? क्या आपके वेब सर्वर के पास इस निर्देशिका में लेखन पहुंच है?

उम्मीद है कि इससे मदद मिलती है।

+0

धन्यवाद! मेरी समस्या कुकीज़ के साथ सही ढंग से संग्रहीत नहीं की जा रही थी, जिसके कारण पृष्ठों के बीच सभी सत्र चर खो जाएंगे। फिक्स्ड! – tozhan

2

इससे पहले कि आप इसे बढ़ाने से पहले "विचार" के मूल्य की जांच करें। तो कुछ विचित्र कारण के लिए, यह एक स्ट्रिंग पर सेट रही है, तो आप 1 जोड़ने जब यह करने के लिए, यह हमेशा वापस आ जाएंगे, 1.

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

जांच करें, कहीं सत्र पथ बचाने वेब सर्वर द्वारा लिखने योग्य है ।

वाकई कुकी चालू किया हुआ है .. अगर कुकी सेट और प्रेषित किया जा रहा है देखने के लिए वापस फ़ायरबग विस्तार के साथ

उपयोग फ़ायरफ़ॉक्स (जब मैं उन्हें बंद कर देते हैं कुछ परीक्षण करने के लिए मैं भूल जाते हैं)।

और एक असंबंधित नोट पर, php5 को देखना शुरू करें, क्योंकि php 4.4.9 php4 श्रृंखला का अंतिम भाग है।

2

ठीक है, हम कोड त्रुटि को खत्म कर सकते हैं क्योंकि मैंने अपने सर्वर (PHP 5) पर कोड का परीक्षण किया था।

  1. आप session_unset() या session_destroy() कहीं भी बुला रहे हैं:

    यहाँ क्या जांच करने के लिए है? ये फ़ंक्शन तुरंत सत्र डेटा हटा देंगे। अगर मैं इसे अपनी लिपि के अंत में रखता हूं, तो यह आपके जैसा वर्णन करने जैसा व्यवहार करता है।

  2. क्या यह सभी ब्राउज़रों में समान कार्य करता है?यदि यह एक ब्राउज़र पर काम करता है और दूसरा नहीं, तो आपके पास गैर-क्रियाशील ब्राउज़र पर कॉन्फ़िगरेशन समस्या हो सकती है (यानी आपने कुकीज़ बंद कर दी है और उन्हें चालू करने के लिए भूल गए हैं, या गलती से कुकीज़ को अवरुद्ध कर रहे हैं)।

  3. क्या सत्र फ़ोल्डर लिखने योग्य है? आप is_writable() के साथ इसका परीक्षण नहीं कर सकते हैं, इसलिए आपको फ़ोल्डर में जाना होगा (phpinfo() से यह/var/php_sessions जैसा दिखता है) और सुनिश्चित करें कि सत्र वास्तव में बनाए जा रहे हैं।

1

मैं जानता हूँ कि एक ही समाधान मैं (अपाचे 1 के साथ OSX और सिर्फ PHP5 में स्विच) में पाया गया है जब मैं एक ऐसी ही समस्या थी था कि 1 विशिष्ट कुंजी unsetting (यानी सेट नहीं ($ _ सत्र [ 'कुंजी']);) इसे बचाने के लिए कारण नहीं था। जैसे ही मैंने उस कुंजी को अनसेट नहीं किया, उतना ही बचाया। मैंने इसे फिर से कभी नहीं देखा है, उस सर्वर को किसी अन्य साइट पर छोड़कर, लेकिन फिर यह एक अलग चर था। न तो कुछ खास थे।

1

यहां एक आम समस्या है जिसे मैंने अन्य टिप्पणियों में संबोधित नहीं किया है: क्या आपका होस्ट किसी प्रकार का कैश चला रहा है? यदि वे स्वचालित रूप से कुछ फैशन में परिणाम कैश कर रहे हैं तो आपको इस प्रकार का व्यवहार मिल जाएगा।

1

बस एक छोटा सा नोट जोड़ना चाहता था कि यदि आप गलती से अपने पृष्ठों पर session_start() कथन याद करते हैं तो यह भी हो सकता है।

2

मैं जानता हूँ कि एक ही समाधान मैं (अपाचे 1 के साथ OSX और सिर्फ PHP5 में स्विच) में पाया गया है जब मैं एक ऐसी ही समस्या थी था कि 1 विशिष्ट कुंजी unsetting (यानी सेट नहीं ($ _ सत्र [ 'कुंजी']);) था इसे बचाने के लिए नहीं। जैसे ही मैंने उस कुंजी को अनसेट नहीं किया, उतना ही बचाया। मैंने इसे फिर से कभी नहीं देखा है, उस सर्वर को किसी अन्य साइट पर छोड़कर, लेकिन फिर यह एक अलग चर था। न तो कुछ खास थे।

इस डेरिल के लिए धन्यवाद। इससे मुझे मदद मिली। मैं एक सत्र चर को हटा रहा था, और किसी कारण से यह सत्र को करने से रोक रहा था। अब मैं इसे सिर्फ शून्य पर सेट कर रहा हूं (जो मेरे ऐप के लिए ठीक है), और यह काम करता है।

0

जांचें कि क्या आप session_write_close() का उपयोग कर रहे हैं; कहीं भी, मैं एक और सत्र के बाद इस अधिकार का उपयोग कर रहा था और फिर सत्र में फिर से लिखने की कोशिश कर रहा था और यह काम नहीं कर रहा था .. तो बस टिप्पणी करें कि sh * t

2

यदि आप php5 में सत्र सेट करते हैं, तो कोशिश करें इसे php4 पेज पर पढ़ें, यह सही जगह पर नहीं दिख सकता है! पृष्ठों को एक ही PHP संस्करण बनाएं या session_path सेट करें।

3

जांचें कि समूह और मालिक किस फ़ोल्डर में हैं, जहां समूह और मालिक हैं। यदि समूह आईडी या उपयोगकर्ता आईडी गलत हैं, उदाहरण के लिए, रूट पर सेट करें, तो सत्रों को ठीक से सहेजने का कारण नहीं होगा।

8

एक ही समस्या थी - मेरे साथ क्या हुआ है हमारे सर्वर व्यवस्थापक ने session.cookie_secure बूलियन को चालू कर दिया है, जिसका अर्थ है कि कुकीज़ केवल एक सुरक्षित कनेक्शन पर भेजी जाएगी। चूंकि कुकी नहीं मिल रही थी, इसलिए PHP प्रत्येक बार एक नया सत्र बना रहा था, इस प्रकार सत्र चर नहीं देखा जा रहा था।

+1

यह मेरी समस्या थी - और मैंने session.cookie_secure खुद को सेट किया - duh! अजीब बात यह है कि यह अचानक बंद होने से लगभग 2 सप्ताह पहले असुरक्षित वातावरण में काम करना जारी रखता था - इसलिए मैंने दोनों को जोड़ने के लिए नहीं सोचा था। –

2

मैंने उम्र को एक समान समस्या के उत्तर की तलाश में बिताया। यह कोड या सेटअप के साथ कोई मुद्दा नहीं था, क्योंकि एक ही समान कोड उसी सर्वर पर किसी अन्य .php में पूरी तरह से काम करता था। इस पृष्ठ में सत्र में सहेजे जा रहे डेटा की बहुत बड़ी मात्रा के कारण समस्या का समाधान हुआ।एक स्थान पर हमारे पास इस तरह की एक पंक्ति थी: $_SESSION['full_list'] = $full_list जहां $full_list डेटाबेस से लोड डेटा की एक सरणी थी; प्रत्येक पंक्ति लगभग 150 तत्वों की एक सरणी थी। जब कोड को कुछ साल पहले लिखा गया था, डीबी में केवल 1000 पंक्तियां थीं, इसलिए $full_list में लगभग 100 तत्व शामिल थे, प्रत्येक में लगभग 20 तत्वों की सरणी थी। समय के साथ, 20 तत्व 150 और 1000 पंक्तियों में बदलकर 17000 हो गए, इसलिए कोड सत्र में 64 मेगापिक्सल डेटा के करीब भंडारित कर रहा था। जाहिर है, इस डेटा को संग्रहीत किया जा रहा है, इसने कुछ और स्टोर करने से इनकार कर दिया। एक बार जब हमने सत्र में इसे सहेजे बिना स्थानीय रूप से डेटा से निपटने के लिए कोड बदल दिया, तो सबकुछ पूरी तरह से काम करता था।

1

मेरे पास सत्र कुकी पथ "/" के बजाय "//" पर सेट था। फायरबग भयानक है। उम्मीद है कि यह किसी की मदद करेगा।

6

मैं समस्या निम्नलिखित था

index.php

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

index2.php

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

चर $_SESSION['a'] सही तरीके से सेट नहीं किया गया। तब मैं बदल गया है index.php तदनुसार

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

मुझे पता है कि यह आंतरिक रूप से मतलब है न, मैं सिर्फ अपने आप को समझा है कि सत्र चर परिवर्तन सुनिश्चित करें कि आप नहीं कर रहे हैं बनाने के लिए पर्याप्त :) त्वरित नहीं था

+0

/इसमें कोई समस्या यह है कि आपका हेडर 'लोकेशन' और 'index2.php'' हेडर ('location: index2.php') के बीच लापता स्थान की वजह से पुनर्निर्देशित नहीं होगा; <<= काम नहीं करेगा, लेकिन यह => 'हेडर ('स्थान: index2.php') होगा;' –

+0

यह मेरे लिए काम करता है! जानना चाहेंगे क्यों:/ – deacs

11

चेक http: // के साथ https: // मिश्रण। सत्र परिवर्तनीय सुरक्षित और असुरक्षित सत्रों के बीच प्रवाह नहीं करते हैं।

1

सुरक्षित पृष्ठ का उपयोग करते समय मुझे यह समस्या थी, जहां मैं www.domain.com/auth.php से आ रहा था जो डोमेन.com/destpage.php पर रीडायरेक्ट किया गया था। मैंने auth.php लिंक से www को हटा दिया और यह काम किया। यह मुझे फेंक दिया क्योंकि सब कुछ अन्यथा काम किया; जब मैं गंतव्य पर पहुंचा तो सत्र सेट नहीं किया गया था।

1

एक आम समस्या जिसे अक्सर अनदेखा किया जाता है यह भी है कि session_start() कमांड से पहले कोई अन्य कोड या अतिरिक्त अंतर नहीं होना चाहिए।

मुझे यह समस्या पहले से मिली थी जहां सत्र_start() से पहले एक खाली रेखा थी जिसके कारण यह ठीक से काम नहीं करता था।

1

अपनी php.ini संपादित करें।
मुझे लगता है कि session.gc_probability का मान 1 है, इसलिए 0.

session.gc_probability=0 
1

के लिए सेट मेरा समाधान जोड़ना:

चेक आप सही डोमेन का उपयोग करता है, तो। मैं सत्र शुरू करने के लिए www.mysite.com का उपयोग कर रहा था, और इसे mysite.com (www के बिना) प्राप्त करने का प्रयास किया।

मैंने सुरक्षित डोमेन/साइट पर www के लिए सभी डोमेन के htaccess पुनर्लेख को जोड़कर हल किया है।

यह भी जांचें कि क्या आप http या https का उपयोग करते हैं या नहीं।

+0

वास्तव में, https://example.net का उपयोग करके मेरे ब्राउज़र ने सत्र कुकी को संग्रहित नहीं किया था। Https://www.example.net के साथ यह काम किया। लेकिन मेजबाननाम कैसे अंतर कर सकता है? – xebeche

+0

मान लें कि प्रत्येक सबडोमेन के सत्रों के लिए अपना अस्थायी फ़ोल्डर है। 'www' सबडोमेन के रूप में भी गिना जाता है। –

+0

मेरे मामले में एप्लिकेशन ने हमेशा सटीक वही सेट-कुकी हेडर w/'domain = www.example.net' भेजा लेकिन फ़ायरफ़ॉक्स चुपचाप (मैंने इसे लॉग करने के तरीके के लिए 2h देखा) कुकी को त्याग दिया गया था यदि साइट को' example.net'। एप्लिकेशन को बदलना ताकि वह 'domain = example.net' को भेज सके। बीटीडब्लू, सर्वर पर यह 'UseCanonicalName On' के संयोजन के साथ होता है w/'ServerName www.example.net'। – xebeche

0

मुझे कुछ और चीजें करना पड़ा (मुझे एक ही समस्या थी: PHP के उन्नयन के बाद कोई सैसन प्रतिधारण नहीं 5.4)। आपके सर्वर के PHP के आधार पर आपको बहुत से लोगों की आवश्यकता नहीं है।आईएनआई में शामिल है (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 वाले और कुछ अन्य जारी परीक्षण (जानकारी के लिए Google)। मैं फिर से चीजों को फिर से प्राप्त करने के लिए एक मूल संशोधित application_top.php के साथ मूल session.php फ़ाइलों (शामिल/कक्षाएं और शामिल/फ़ंक्शंस) का उपयोग करने में सक्षम होने के समाप्त हो गया। Php.ini सेटिंग्स मुख्य समस्या थीं, लेकिन यह निश्चित रूप से इस बात पर निर्भर करता है कि आपकी सर्वर कंपनी ने डिफ़ॉल्ट के रूप में क्या स्थापित किया है।

संबंधित मुद्दे