मुझे इस विशेष समस्या को डीबग करने में कुछ गंभीर समस्या है और मुझे उम्मीद है कि किसी के पास कोई संकेत है कि मैं गलत कर रहा हूं।आउटपुट के बाद 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 विफल रहा? मैंने फ़ायरबग और सफारी डेवलपर टूल का उपयोग करके हेडर की जांच की, कुछ भी अजीब नहीं, लेकिन जब भी मैं सफारी के साथ अजाक्स कॉल करता हूं, तो कॉलर पेज डेटा को पुनः लोड करता है (सर्वर पर उर्फ का पता लगाने ...)।
मुझे वास्तव में कुछ भी समझ में नहीं आता है।
@ _ @ इसने मेरी आँखों को सभी गुगली बना दिया। – rockerest
ठीक है, यह भी अजनबी हो रहा है, मुझे वास्तव में कुछ मदद की ज़रूरत है: –
बहुत कठिन सवाल। यदि कुछ भी है, तो यह अतिरिक्त अंक के लायक है। इसके लिए किसके लिए? –