2011-04-11 14 views
12

मुझे इस विशेष समस्या को डीबग करने में कुछ गंभीर समस्या है और मुझे उम्मीद है कि किसी के पास कोई संकेत है कि मैं गलत कर रहा हूं।आउटपुट के बाद PHP सत्र नहीं लिखा गया है (बाहरी AJAX कॉल पर गूंज या print_r)

मैं बिल्डिंग ब्लॉक्स कि अजाक्स (prototypejs) कॉल और कार्यों कि दिए गए क्रम में एचटीएमएल हिस्सा पार्स का उपयोग कर अद्यतन के रूप में पैराग्राफ का उपयोग करता है एक कस्टम सीएमएस प्रणाली काम कर रहे है, उन्हें साफ और एक सत्र में साहचर्य सरणियों में यह डेटा सहेजना चर। उपयोगकर्ता लॉग इन करते हैं, सत्र बनाया जाता है और मैं इस सत्र के लिए हर पृष्ठ में समस्या के बिना जांच कर सकता हूं। सिस्टम सीधे निश्चित वेबसाइटों पर काम करता है, इसलिए उपयोगकर्ता रीयलटाइम पर अपने अपडेट देख सकता है और सामान्य उपयोगकर्ता के रूप में साइट ब्राउज़ कर सकता है, लेकिन संपादन कर सकता है। तो, यहां कुछ भी नया नहीं है। लेकिन यहां अजीब चीज है। संपादन मोड पर

enduser साइट (व्यवस्थापक उपयोगकर्ता के प्रवेश): पथ "/"

के बाद लॉग इन स्थिति सत्यापित होने के बाद एक समारोह को संसाधित करता है संपादन योग्य सामग्री और सत्र के लिए एक साहचर्य सरणी की बचत होती है, यह भी शुरू होता है प्रत्येक पैराग्राफ को संपादित करने के लिए कुछ जावास्क्रिप्ट ऑब्जेक्ट्स। डेटा वास्तव में सहेजा जाता है, मैं यह जांचने के लिए बाहरी स्क्रिप्ट का उपयोग कर सकता हूं कि यह php स्क्रिप्ट समाप्त होने के बाद क्या है। अगर मैं एक नया पृष्ठ लोड करता हूं (नई सामग्री), सत्र नए डेटा के साथ अपडेट हो जाता है)

व्यवस्थापक उपयोगकर्ता एक संशोधित करता है एक इनस्थेडिटर का उपयोग करके पैराग्राफ और यह एचटीएमएल खंड अजाक्स के माध्यम से एक php स्क्रिप्ट पर भेजता है जो नामित सत्र शुरू करता है, वर्तमान सत्र डेटा पढ़ता है, जांचता है कि क्या अनुच्छेद संशोधित किया जाना चाहिए, जोड़ा गया है या हटाया गया है और $_SESSION में मौजूदा सरणी कुंजियों के मानों को पुन: असाइन किया जाना चाहिए। यदि मैं नया डेटा निर्दिष्ट करने के बाद var_dump() o प्रिंट_आर से $_SESSION बना देता हूं। उसके बाद स्क्रिप्ट संसाधित एचटीएमएल को उजागर करती है, और AJAX कॉलिंग पृष्ठ पर मूल पैराग्राफ अपडेट करता है।

यह स्क्रिप्ट /admin/cms/...etc में है, जिसका अर्थ है साइट की रूट के अंदर कम से कम 4 निर्देशिकाएं।

जब स्क्रिप्ट समाप्त होती है, तो मैं यह देखने के लिए एक ही सत्र डंप स्क्रिप्ट का उपयोग करके जांच करता हूं कि डेटा वास्तव में लिखा गया था या नहीं, लेकिन नहीं, $_SESSION में केवल कॉलिंग पृष्ठ का मूल डेटा है। वही आईडी, एक ही सत्र का नाम, वही session_start() लेकिन कोई डेटा नहीं लिखा जाता है। यह पूरा ऑपरेशन बहुत तेज़ है, इसलिए हालांकि यह एक गति समस्या हो सकती है, session_write_close अपना काम कर सकते हैं इससे पहले स्क्रिप्ट समाप्त होती है।

लेकिन अगर मैं $_SESSION सरणी में एक नई कुंजी जोड़ता हूं और वहां कुछ डेटा डालता हूं, तो डेटा अपडेट और लिखे जाते हैं। अगर मैं इस स्क्रिप्ट पर कुछ भी आउटपुट नहीं करता हूं और केवल डेटा को प्रोसेस करता हूं और सत्र चर सेट करता हूं तो यह भी अपडेट और लिखे जाते हैं।

ऐसा लगता है कि $_SESSION सरणी के कुछ सदस्यों को अपडेट करने के लिए अवरुद्ध हो रहा है।

मैंने इस त्रुटि को ट्रैक करने के लिए क्या किया और मुझे यकीन है कि मैं गलत नहीं कर रहा हूं।

  • 1.- register_globals निश्चित रूप से
  • 2.- session_name() और session_start() हमेशा वर्तमान और दिए गए
    क्रम में हैं बंद कर रहे हैं। मैं एक ही पृष्ठ
    कई नामित सत्र का उपयोग करने पर एक से अधिक
    session_start() -close किया करते थे, लेकिन लिए समस्या यह लंबे समय तक इतना नहीं है परिष्कृत करें।
  • 3.- सत्र डेटा संसाधित होने के बाद मैं session_write_close() का उपयोग करता हूं। इसके अलावा
    बिना प्रयास किए, php को डेटा देने के लिए का निर्णय लेने की अनुमति दी, लेकिन कोई भाग्य नहीं।
  • 4.- मैं केवल एसआईडी के लिए कुकीज़ का उपयोग कर रहा हूं।
  • 5.- सत्र/tmp पर संग्रहीत हैं, मैं डेटा अपडेट होने पर देख सकता हूं।
  • मैंने डीबी पर एक कस्टम सेव हैंडलर का उपयोग करने का भी प्रयास किया, लेकिन एक ही समस्या,
    "_write" केवल तभी मिला जब कोई आउटपुट मौजूद नहीं था।
  • मैंने इस विषय के लिए php.net, stackoverflow, google, आदि की खोज की। मैंने कभी जांच के बिना नहीं पूछा, यह कई सालों में मेरा पहला समय है ... लेकिन यह इतना अनौपचारिक है कि यह कुछ छोटा नहीं होना चाहिए।

सबसे अजीब चीज यह है कि जब मैं आउटपुट के बिना डेटा को संसाधित करता हूं $_SESSION ठीक हो जाता है। लेकिन अगर मैं आउटपुट जोड़कर बाद में इस स्क्रिप्ट को संशोधित करता हूं और फिर कोशिश करता हूं, तो केवल नया (आखिरी) मूल्य मौजूद होने के बजाय मुझे मूल मूल्य वापस मिलता है, जिसे कॉलिंग पेज द्वारा पहली बार बनाया गया है, कभी-कभी कुछ के आसपास खेलने के बाद बार! PHP स्क्रिप्ट के बीच मूल्य कैश नहीं कर सकता है या मेरे पास globlals नहीं है।

मैं वास्तव में अनजान हूं। यह प्रणाली PHP4.3 पर निर्दोष काम करती है, क्योंकि मैं अपने उपयोगकर्ताओं के दो पतंगों के लिए 5.3.3 का उपयोग कर रहा हूं जहां मिश्रित होने वाले डेटा को कैलिम करना है, इसलिए मैंने जांच की और हां, गंभीर समस्याएं हैं। आज मैंने अपडेट किया (5.3.6) और मुझे इस सत्र मूल्यों को कम नहीं किया जा सकता है।

स्क्रिप्ट अजाक्स के माध्यम से बुलाया कोड:

<? 
session_cache_limiter('nocache'); 
session_name("CMS_ses"); 
session_start(); 
include('../htmLawed/htmLawed.php'); 
include("utils_cms.php"); 
include("../../../php/utils_array.php"); 

$value=$_POST['value']; 
$editorId=$_POST['editorId']; 
$clase=$_POST['clase']; 
$editorId=str_replace("pre","",$editorId); 
$value=html_entity_decode(stripslashes($value),ENT_QUOTES); 
if (strlen(trim($value))==0) 
    { 
    die(); 
    } 
$value="<div id=\"$editorId\" class=\"$clase\">$value</div>"; 

$newXHTML=$value; 
$retorno=CMS_nuevoBloque($newXHTML,$editorId); 
$_SESSION['data']['CMSeditores']=$retorno[1]; 
$_SESSION['data']['CMScont']=$retorno[2]; 
session_write_close(); 

print_r($retorno[0]); //Offending part...without everything works 
?> 

वास्तव में यहाँ अजीब कुछ भी नहीं .... मुख्य पृष्ठ कोड आदि भी सरल, कोई अजीब php निर्देशों है,

यहाँ फोन करने वाले का शीर्षक है पेज

include 'php/db.php'; 
$len=$_GET['len']; 
$sec=$_GET['sec']; 
$cont=$_GET['cont']; 
$admfin=$_GET['admfin']; 
$fecha=$_GET['fecha']; 
$token=$_GET['token']; 
$cur=$_GET['cur']; 

$PHP_SELF=$_SERVER['PHP_SELF']; 
session_cache_limiter('nocache'); 
session_name("CMS_ses"); 
session_start(); 

$passvar=''; 
unset($adm); 
if ((!empty($_SESSION['cms_logged'])) and (!isset($admfin))) 
    { 
    $nivelpermisos=$_SESSION['cms_logged_group']; 
    $useractual=$_SESSION['cms_logged']; 
    $adm=1; 

    } 
elseif (empty($_SESSION['cms_logged'])) 
    { 
    unset($useractual); 
    } 
    //.........rest of the code 

अद्यतन: मैं देर रात परीक्षण किया था और someting मैं नहीं है understand.HElP कृपया पाया: यह न केवल सत्र लेकिन यह भी साथ है MySQL प्रश्नों के साथ। वही कोड, लेकिन $_SESSION सरणी पर लिखने की कोशिश करने के बजाय मैंने session_id का उपयोग करके इनोडब तालिका में एक साधारण अपडेट किया। जब मैं कुछ कोड आउटपुट करता हूं, तो अद्यतन निष्पादित हो जाता है, (मैं क्वेरी स्ट्रिंग आउटपुट कर सकता हूं और mysql_error() या नोटिस) समस्याएं नहीं कर सकता, लेकिन डेटाबेस को जांचना पंक्ति को अपडेट नहीं किया जाता है। यदि स्क्रिप्ट और क्वेरी कम हो जाती है तो आउटपुट को बाहर निकालना। केवल सामान्य बात यह है कि सत्र शुरू हो जाते हैं और आउटपुट बनाया जाता है।

मैंने अपाचे, आदि (जो जानता है) को फिर से शुरू किया लेकिन कोई किस्मत नहीं। तब मैंने कुछ सचमुच बेवकूफ बना दिया, क्योंकि यह एक सर्वर की तरफ है। मैंने अपना ब्राउज़र फ़ायरफ़ॉक्स में बदल दिया (सफारी का उपयोग करके) और सबकुछ काम करता है! ठीक है, फिर से, सफारी वापस, कुछ भी काम करता है। दोनों तरफ एक तरफ चल रहे हैं, एक ही मुद्दा। PHP सर्वर पक्ष है, विभिन्न ब्राउज़र कोड को अलग-अलग कैसे प्रबंधित कर सकते हैं, क्या ब्राउजर अपाचे को रोलबैक करने के लिए कह सकता है, अनुरोध के बिना दो बार एक ही स्क्रिप्ट को संभाला या कॉल नहीं किया जा सकता है (सुरक्षित सफारी डेवलपर कंसोल की जांच की जाती है और स्क्रिप्ट केवल एक बार कहा जाता है)? क्या सफारी चुपचाप डेटा पुनः सबमिट कर सकता है क्योंकि यह "सोचता है" AJAX विफल रहा? मैंने फ़ायरबग और सफारी डेवलपर टूल का उपयोग करके हेडर की जांच की, कुछ भी अजीब नहीं, लेकिन जब भी मैं सफारी के साथ अजाक्स कॉल करता हूं, तो कॉलर पेज डेटा को पुनः लोड करता है (सर्वर पर उर्फ ​​का पता लगाने ...)।

मुझे वास्तव में कुछ भी समझ में नहीं आता है।

+7

@ _ @ इसने मेरी आँखों को सभी गुगली बना दिया। – rockerest

+0

ठीक है, यह भी अजनबी हो रहा है, मुझे वास्तव में कुछ मदद की ज़रूरत है: –

+0

बहुत कठिन सवाल। यदि कुछ भी है, तो यह अतिरिक्त अंक के लायक है। इसके लिए किसके लिए? –

उत्तर

0

मुझे एक ही समस्या थी लेकिन यह कुछ साल पहले यानी थी।आईई हेडर को अपने तरीके से जोड़ता है और इससे अजीब php bugs का कारण बनता है जो आप php.net अभिलेखागार में पा सकते हैं।

@ डिएगो पिनो नवरारो, कृपया this help page देखें और सफारी और PHP के साथ इसके मुद्दों को ढूंढें।

मुझे "Safari "forget" http-authentication's logon-information" भी मिला।

0

मुझे यकीन नहीं है लेकिन मुझे लगता है कि कुछ सुझाव उपयोगी हो सकते हैं।

हटाने सत्र कुकीज़ परीक्षण प्रयोजनों के लिए पृष्ठ को रीफ्रेश करने से पहले :)

सुनिश्चित करें कि आप पाइप चरित्र युक्त एक प्रमुख के साथ किसी भी सरणियों बताए नहीं कर रहे हैं (|)। यह सत्र डेटा को धारावाहिक और सहेजने से रोक देगा।

सत्र_regenerate_id (सत्य) करें; कई मामलों session_write_close सत्र_regenerate_id के साथ कोई फर्क नहीं पड़ता है। या सिर्फ session_write_close() के बाद session_start() करें यदि आप एसआईडी पर भरोसा कर रहे हैं; और आपके मामले में मुझे लगता है कि यह आपको समस्या का कारण बन रहा है क्योंकि आप हर बार वर्तमान सत्र समाप्त कर रहे हैं और इसे अगले पृष्ठ के लिए शुरू नहीं कर रहे हैं। आशा है कि आप मेरा मुद्दा प्राप्त करें। और भी यह सुनिश्चित करने के लिए कि ब्राउज़र वास्तव में ब्राउज़र का उपयोग ob_end_flush() पर फ़्लश किया गया है;

मैं

$_SESSION['data']['CMSeditores']=$retorno[1]; 
$_SESSION['data']['CMScont']=$retorno[2]; 

और

$nivelpermisos=$_SESSION['cms_logged_group']; 
    $useractual=$_SESSION['cms_logged']; 

मुझे लगता है कि आप कुछ और कोड जहां डाटा हिस्सा व्यवस्थापक लॉगिन भाग के बजाय समस्या का कारण है पेस्ट करने की आवश्यकता के बीच संबंध नहीं समझ सके।

मैं इस मदद करता है उम्मीद है। :)

1

मैं यह करने के लिए इसी तरह की एक समस्या थी (अगर मैं सही ढंग से समझ चुके हैं)। स्क्रिप्ट समाप्त होने के बाद मुझे सत्र डेटा को लिखने के लिए (कस्टम सत्र ड्राइवर के लिए) बल देने की आवश्यकता थी। एक शट डाउन फ़ंक्शन पंजीकृत किया जा सकता है जिसे स्क्रिप्ट समाप्त होने के बाद चलाना चाहिए।

शायद यह आपकी समस्या को हल करेगा (या हल करने में आपकी सहायता करेगा)।

http://php.net/manual/en/function.register-shutdown-function.php

+0

सही उत्तर नहीं है, लेकिन कम से कम आपने एक विशिष्ट समाधान की पेशकश की है और कोई प्रश्न नहीं पूछा है। बधाई! –

0

तो ऐसा कोई कारण आप सत्र नाम दो बार की स्थापना कर रहे हैं? मेरे पास अतीत में समस्याएं थीं जहां मैं नाम के बिना सत्र स्थापित करूंगा, फिर स्क्रिप्ट का एक और टुकड़ा (मेरा नहीं) सत्र का नाम दे रहा था। स्क्रिप्ट के अंत में भी मैं सत्र चर को मुद्रित करने में सक्षम था, लेकिन एक बार जब मैं एक नए पृष्ठ पर गया तो मेरा सत्र भूल गया था। यह तब तक नहीं था जब तक मैंने दूसरी स्क्रिप्ट में शामिल नाम को मेरे सत्र कॉल में कॉपी नहीं किया था, जिसे हल किया गया था।

जांचें कि कोई अन्य सत्र नाम उपयोग नहीं किया जा रहा है; सत्र में पहली कॉल पर, शायद एक बार सत्र का नामकरण करने का प्रयास करें?

0

प्रश्न: क्या आप session_start() पहली चीज़ को कॉल कर रहे हैं ... ब्राउज़र में किसी भी आउटपुट से पहले और किसी भी चर को आवंटित करने से पहले?

मूर्खतापूर्ण लगता है लेकिन इसे आज़माएं।

इसके अलावा, आप सत्र नामों का उपयोग क्यों कर रहे हैं? वास्तव में तब तक जरूरी नहीं है जब तक आपके पास अलग-अलग उद्देश्यों की सेवा करने वाले एक ही नाम के साथ कई सत्र चर नहीं होते हैं और यदि ऐसा होता है तो आपको पहले इसे ठीक करने की आवश्यकता होती है!

1

आपकी मदद के लिए धन्यवाद। मैं सही क्रम में सब कुछ कर रहा था और अभी भी सत्र डेटा लिखा नहीं जा रहा था। सत्र नाम जहां necesary क्योंकि कभी-कभी हम एक ही कस्टम सीएमएस का उपयोग कर एक ही डोमेन पर कई साइटों का परीक्षण करते हैं। तो, आखिरकार, बहुत सारे परीक्षण और कोई किस्मत बनाने के बाद, मैंने पाया कि इस सर्वर पर रजिस्टर ग्लोबल्स सक्रिय थे (हम इसका कभी भी उपयोग नहीं करते थे, इस विकल्प को ध्यान में रखते हुए कोड लिखा गया था), लेकिन यह सत्रों के साथ गड़बड़ करता है! इसे बंद करने से एक बड़ा बदलाव आया। कोई और समस्या नहीं है। मैंने डीबी में कस्टम सत्र हैंडलर भी बनाया, इसलिए मैं अधिक केंद्रीकृत तरीके से समस्याओं को ट्रैक कर सकता था। सम्मेलन: कभी भी पंजीकरण ग्लोबल्स + नामित सत्रों का उपयोग न करें, सत्रों में एक जटिल डेटा। वैसे भी, मैं इस मुद्दे को अधिक समय और अधिक परीक्षण दूंगा। अजाक्स कॉल कभी-कभी बहुत तेज़ होते हैं, मुझे नींद कमांड देना पड़ता था इसलिए सत्र डेटा लिखना वास्तव में किया जाता था। धन्यवाद

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