ठीक है, यदि भौतिक स्मृति सीमित है (आप गंभीर त्रुटि :)
Fatal error: Allowed memory size of 536870912 bytes exhausted
मैं डिस्क पर उत्पादन बफरिंग करने के लिए (ob_start
पर कॉलबैक पैरामीटर देखें) सुझाव है कि देखते हैं। आउटपुट बफरिंग कामों को खंडित किया गया है, इसका मतलब है, अगर स्मृति में एकल खंड को रखने के लिए अभी भी पर्याप्त स्मृति है, तो आप इसे एक अस्थायी फ़ाइल में संग्रहीत कर सकते हैं।
// handle output buffering via callback, set chunksize to one kilobyte
ob_start($output_callback, $chunk_size = 1024);
हालांकि आपको यह ध्यान में रखना चाहिए कि यह केवल बफरिंग के दौरान घातक त्रुटि को रोक देगा। अगर आप अब बफर वापस करना चाहते हैं, तो आपको अभी भी पर्याप्त मेमोरी या की आवश्यकता है, आप फ़ाइल-हैंडल या फ़ाइल-पथ वापस कर सकते हैं ताकि आप आउटपुट स्ट्रीम भी कर सकें।
हालांकि आप उस फ़ाइल का उपयोग तब बाइट्स में आकार प्राप्त करने के लिए कर सकते हैं। PHP स्ट्रिंग्स के लिए ओवरहेड ज्यादा आईआईआरसी नहीं है, इसलिए यदि फाइलसाइज के लिए अभी भी पर्याप्त मेमोरी है तो इसे अच्छी तरह से काम करना चाहिए। आप ऑफसेट को थोड़ा कमरा रखने और सुरक्षित खेलने के लिए निकाल सकते हैं। बस इसे थोड़ा सा प्रयास करें और त्रुटि दें।
कुछ उदाहरण कोड (PHP 5.4):
<?php
/**
* @link http://stackoverflow.com/questions/5446647/how-can-i-use-var-dump-output-buffering-without-memory-errors/
*/
class OutputBuffer
{
/**
* @var int
*/
private $chunkSize;
/**
* @var bool
*/
private $started;
/**
* @var SplFileObject
*/
private $store;
/**
* @var bool Set Verbosity to true to output analysis data to stderr
*/
private $verbose = true;
public function __construct($chunkSize = 1024) {
$this->chunkSize = $chunkSize;
$this->store = new SplTempFileObject();
}
public function start() {
if ($this->started) {
throw new BadMethodCallException('Buffering already started, can not start again.');
}
$this->started = true;
$result = ob_start(array($this, 'bufferCallback'), $this->chunkSize);
$this->verbose && file_put_contents('php://stderr', sprintf("Starting Buffering: %d; Level %d\n", $result, ob_get_level()));
return $result;
}
public function flush() {
$this->started && ob_flush();
}
public function stop() {
if ($this->started) {
ob_flush();
$result = ob_end_flush();
$this->started = false;
$this->verbose && file_put_contents('php://stderr', sprintf("Buffering stopped: %d; Level %d\n", $result, ob_get_level()));
}
}
private function bufferCallback($chunk, $flags) {
$chunkSize = strlen($chunk);
if ($this->verbose) {
$level = ob_get_level();
$constants = ['PHP_OUTPUT_HANDLER_START', 'PHP_OUTPUT_HANDLER_WRITE', 'PHP_OUTPUT_HANDLER_FLUSH', 'PHP_OUTPUT_HANDLER_CLEAN', 'PHP_OUTPUT_HANDLER_FINAL'];
$flagsText = '';
foreach ($constants as $i => $constant) {
if ($flags & ($value = constant($constant)) || $value == $flags) {
$flagsText .= (strlen($flagsText) ? ' | ' : '') . $constant . "[$value]";
}
}
file_put_contents('php://stderr', "Buffer Callback: Chunk Size $chunkSize; Flags $flags ($flagsText); Level $level\n");
}
if ($flags & PHP_OUTPUT_HANDLER_FINAL) {
return TRUE;
}
if ($flags & PHP_OUTPUT_HANDLER_START) {
$this->store->fseek(0, SEEK_END);
}
$chunkSize && $this->store->fwrite($chunk);
if ($flags & PHP_OUTPUT_HANDLER_FLUSH) {
// there is nothing to d
}
if ($flags & PHP_OUTPUT_HANDLER_CLEAN) {
$this->store->ftruncate(0);
}
return "";
}
public function getSize() {
$this->store->fseek(0, SEEK_END);
return $this->store->ftell();
}
public function getBufferFile() {
return $this->store;
}
public function getBuffer() {
$array = iterator_to_array($this->store);
return implode('', $array);
}
public function __toString() {
return $this->getBuffer();
}
public function endClean() {
return ob_end_clean();
}
}
$buffer = new OutputBuffer();
echo "Starting Buffering now.\n=======================\n";
$buffer->start();
foreach (range(1, 10) as $iteration) {
$string = "fill{$iteration}";
echo str_repeat($string, 100), "\n";
}
$buffer->stop();
echo "Buffering Results:\n==================\n";
$size = $buffer->getSize();
echo "Buffer Size: $size (string length: ", strlen($buffer), ").\n";
echo "Peeking into buffer: ", var_dump(substr($buffer, 0, 10)), ' ...', var_dump(substr($buffer, -10)), "\n";
आउटपुट:
STDERR: Starting Buffering: 1; Level 1
STDERR: Buffer Callback: Chunk Size 1502; Flags 1 (PHP_OUTPUT_HANDLER_START[1]); Level 1
STDERR: Buffer Callback: Chunk Size 1503; Flags 0 (PHP_OUTPUT_HANDLER_WRITE[0]); Level 1
STDERR: Buffer Callback: Chunk Size 1503; Flags 0 (PHP_OUTPUT_HANDLER_WRITE[0]); Level 1
STDERR: Buffer Callback: Chunk Size 602; Flags 4 (PHP_OUTPUT_HANDLER_FLUSH[4]); Level 1
STDERR: Buffer Callback: Chunk Size 0; Flags 8 (PHP_OUTPUT_HANDLER_FINAL[8]); Level 1
STDERR: Buffering stopped: 1; Level 0
Starting Buffering now.
=======================
Buffering Results:
==================
Buffer Size: 5110 (string length: 5110).
Peeking into buffer: string(10) "fill1fill1"
...string(10) "l10fill10\n"
आप जिज्ञासा से बाहर 'print_r', साथ ही समस्या मिलता है? यदि नहीं, तो क्या आप बहुत सारे रिकर्सन नोटिस देखते हैं? – Charles
@ चार्ल्स, शायद नहीं। मैं * 'print_r' या' var_export' का उपयोग कर सकता हूं लेकिन मुझे वास्तव में यह तथ्य पसंद है कि मैं 'var_dump' द्वारा प्रदान किए गए चर प्रकार और लंबाई की जानकारी को बरकरार रख सकता हूं। Xdebug उपलब्ध होने पर भी अतिरिक्त स्वरूपण लाभ। –
रिकर्सन के कारण शायद यह आउटपुट की असीमित मात्रा है। क्या होता है यह देखने के लिए आउटपुट बफरिंग का उपयोग किये बिना इसे स्वयं को एक ही var पर कॉल करने का प्रयास करें। – Jon