2011-09-21 6 views
5

जारी है मैं इस समस्या से पूरी तरह से खो गया हूं।बहुत लंबी जेसन प्रतिक्रिया बंद हो जाती है और पाठ के रूप में HTTP शीर्षलेख भेजती है तो

मेरे पास एक AJAX क्वेरी है जो एक जेसन प्रतिक्रिया प्राप्त करता है। क्वेरी ज्यादातर परिस्थितियों में ठीक काम करती है हालांकि जेसन प्रतिक्रिया बहुत बड़ी है, हालांकि ठोकर लगती है।

समस्या

प्रतिक्रिया के रूप में समाप्त होता है है:

...est":"test length"}]]} 
HTTP/1.1 200 OK 
Date: Wed, 21 Sep 2011 17:10:32 GMT 
Server: Apache/2.2.11 (Win32) mod_ssl/2.2.11 OpenSSL/0.9.8k PHP/5.3.0 
X-Powered-By: PHP/5.3.0 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Keep-Alive: timeout=5, max=90 
Connection: Keep-Alive 
Transfer-Encoding: chunked 
Content-Type: text/html 

5b03d 
{"ResultsInfo":{"RequestID":"131661886010","FeedCompletion":{"0":"100"}},"ResultsData":[[{"test":"test length"},{"test":"test length"}, 

...0 

... प्रतिनिधित्व करते हैं एक ही "{" परीक्षण ":" परीक्षण लंबाई "} के और अधिक," स्ट्रिंग

तो प्रतिक्रिया के रूप में हो रहा है:

  • डेटा
  • http प्रतिक्रिया हेडर शरीर में मुद्रित की अंतिम भाग
  • पात्रों के 5b03d '
  • डेटा का पहला भाग
  • चरित्र' 0 '

वहाँ प्रतिक्रिया का एक सटीक लंबाई ऐसा होता है कि कम से लेकिन यह 360,791 पात्रों लेकिन नहीं पर ठीक है नहीं है 372797 वर्णों पर।

मैं वाईआई PHP फ्रेमवर्क का उपयोग कर रहा हूं, लेकिन वहां दूर और व्यापक खोज की है और वहां मंचों में कुछ भी नहीं देखा है।

ऐसा लगता है कि वेबसर्वर प्रतिक्रिया को कई टुकड़ों या समय में अलग कर रहा है और फिर से शुरू कर रहा है।

या शायद वापसी का अधिकतम आकार है?

संपादित _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ ___

मैंने सुझाव के अनुसार एप्लिकेशन/जेसन सामग्री प्रकार की कोशिश की है लेकिन यह हो रहा है।

HTTP/1.1 200 OK 
Date: Thu, 22 Sep 2011 08:48:28 GMT 
Server: Apache/2.2.11 (Win32) mod_ssl/2.2.11 OpenSSL/0.9.8k PHP/5.3.0 
X-Powered-By: PHP/5.3.0 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Keep-Alive: timeout=5, max=89 
Connection: Keep-Alive 
Transfer-Encoding: chunked 
Content-Type: application/json 

मैं कैसे इस विशेष स्क्रिप्ट के लिए chunked एन्कोडिंग बंद करूं: हेडर है कि शरीर में दिया जाता है की ट पाठ हिस्सा (जब applciaiton का उपयोग कर/json एन्कोडिंग) के रूप में इस प्रकार है?

** संपादित 2_ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ _

अब मैं अपने हेडर के लिए एक सामग्री की लंबाई को शामिल किया है और प्रतिक्रिया हेडर मैं अभी भी रूप में शरीर में मुद्रित किया जाता है: जैसे कि यह नहीं रह गया है के रूप में chunked भेजा जा रहा है

HTTP/1.1 200 OK 
Date: Thu, 22 Sep 2011 11:55:39 GMT 
Server: Apache/2.2.11 (Win32) mod_ssl/2.2.11 OpenSSL/0.9.8k PHP/5.3.0 
X-Powered-By: PHP/5.3.0 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Content-Length: 372797 
Keep-Alive: timeout=5, max=90 
Connection: Keep-Alive 
Content-Type: application/json 

तो यह लग रहा है। हालांकि एक ही समस्या मौजूद है - प्रतिक्रिया में सामग्री है, फिर शीर्षलेख मुद्रित होने पर अधिक सामग्री।

** केवल अंतर यह है कि इसमें प्रतिक्रिया में '5b03d' या '0' वर्ण नहीं हैं।

EDIT_3_ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ _

के रूप में करने के लिए कहा यहां मेरे PHP कोड

012 का सारांश है
$dataArray = array(
    'ResultsData'=>array(
      array('test'=>'test length'), 
      array('test'=>'test length'), 
      array('test'=>'test length'), 
      ... 
)); 

$return = json_encode($dataArray); 

header('Content-Length: '.strlen($return)); 
header('Content-type: application/json'); 

echo $return; 
+0

आपका PHP कोड कैसा दिखता है? यह बहुत असामान्य है। –

उत्तर

2

क्या आप यहाँ देख रहे हैं हस्तांतरण एन्कोडिंग chunked है - http://en.wikipedia.org/wiki/Chunked_transfer_encoding

इस सामग्री प्रकार से किया जा रहा पाठ/HTML के साथ संयोजन में समस्याओं का कारण बनता। सामग्री प्रकार को एप्लिकेशन/जेसन में सेट करना समस्या को ठीक करना चाहिए।

+0

हाय, मैंने उपरोक्त मेरे संपादन के अनुसार अपनी सामग्री प्रकार को एप्लिकेशन/जेसन में बदल दिया है और यह अभी भी हो रहा है (एन्कोडिंग अभी भी खंडित है) –

1

मुझे इस प्रश्न का उत्तर नहीं मिला है, हालांकि समस्या को अलग कर दिया है।

एक मानक php फ़ाइल में मैं इस कोड लिखा है:

<?php 

// Make a large array of strings 
for($i=0;$i<10000;$i++) 
{   
    $arr[] = "testing this string becuase it is must longer than all the rest to see if we can replicate the problem. testing this string becuase it is must longer than all the rest to see if we can replicate the problem. testing this string becuase it is must longer than all the rest to see if we can replicate the problem."; 
} 

// Create one large string from array 
$var = implode("-",$arr); 

// Set HTTP headers to ensure we are not 'chunking' response 
header('Content-Length: '.strlen($var)); 
header('Content-type: text/html'); 

// Print response 
echo $var; 

?> 

और एक ब्राउज़र में इसे करने के लिए चला गया और एक ही समस्या मिला है।

क्या कोई और मेरे लिए यह कोशिश कर सकता है? (मैंने दो कंप्यूटरों पर एक ही परिणाम के साथ प्रयास किया है)

2

मेरे पास एक जावा सर्वर है जो जेसन कोड के साथ प्रतिक्रिया करता है, जिससे मुझे भ्रष्टाचार का वर्णन होता है। जब लौटा हुआ जेसन बड़ा हो जाता है, तो पाठ दूषित हो जाता है। विभिन्न ब्राउज़र विभिन्न भ्रष्टाचार दिखाते हैं, लेकिन एक ही ब्राउज़र अक्सर एक ही स्थान पर भ्रष्ट होता है।

मेरे परीक्षणों में से एक में मैं 9 4 9 2 बाइट भेजता हूं। पहला 14 9 5 ठीक था, अगले 5204 गायब थे, हालांकि एक वायरशर्क विश्लेषण ने टीसीपी स्ट्रीम में बाइट्स दिखाए। फिर अगले 14 9 5 बाइट सुरक्षित रूप से पहुंचे, जबकि अगले 12 9 8 गायब थे।

ये संख्याएं एक उदाहरण हैं। अन्य ब्राउज़रों को एक ही भेजने के लिए विभिन्न भ्रष्टाचार प्रस्तुत करेंगे। वही ब्राउज़र लगभग समान संख्या दोहरा सकता है। उदाहरण के लिए क्रोम के लिए हमेशा एक ही बाइट पर पहला भ्रष्टाचार होता है।

4000 बाइट्स कहने के लिए सीमित एक जेसन राशि हमेशा सफल हुई।

मुझे इस संदर्भ में सामग्री-लंबाई सेट करके चंकिन को रोकने का कोई तरीका नहीं मिला है। बस आपको कोड की विश्वसनीयता का विचार देने के लिए: वही जैवसेवर ने भ्रष्टाचार के बिना 12 से अधिक वर्षों तक एचटीएमएल के साथ ब्राउज़र की सेवा की है। लेकिन जेसन प्रतिक्रिया आउटस्ट्रीम द्वारा मुझे हेडर सेट किए बिना भेज दिया जाता है।

मुझे लगता है कि जब मैं अपने स्वयं के जावा-प्रोग्राम से भेजता हूं तो शीर्षलेख अपाचे सर्वर द्वारा रचित होते हैं।

0

मुझे कभी भी बदमाश जेसन भेजने में समस्या नहीं थी। लेकिन ..

सही सामग्री को तोड़ दिया जाएगा क्योंकि सामग्री-लंबाई अनजान है जबकि PHP इसे और यह क्लाइंट को प्रतिबिंबित करता है।

  1. ob_start() ... ob_end_flush() सुनिश्चित करता है कि सामग्री एक ही बार में भेज दिया जाएगा और सामग्री-lenth हैडर स्वचालित रूप से स्थापित किया जाएगा।

  2. संपीड़ित डेटा कभी भी नहीं ठहराया जाएगा। तो: ob_start (ob_gzhandler) ... ob_end_flush() प्रभावी है।

  3. क्लाइंट स्क्रिप्ट के अंदर अपने जेसन का परीक्षण करें।

  4. 'परीक्षण' दोहराने के लिए बेकार है। घोंसले के लिए एक सीमा है।

डेटाअरे = सरणी ('परिणामडेटा' => सरणी (लंबाई 0, लंबाई 1, लंबाई 2, ...));

echo json_encode ($ dataArray, JSON_NUMERIC_CHECK);

JSON_NUMERIC_CHECK स्ट्रिप्स संख्याओं से उद्धरण।

  1. ? 5b03d? क्या आप बाइनरी तार भेजने की कोशिश करते हैं?

  2. मुझे लगता है कि 373kb की सामग्री लंबाई मेमोरी ओवरफ़्लो से बहुत दूर है?

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