How do you debug php “Out of Memory” issues?

前端 未结 6 833
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-09 02:46

I\'ve had some issues lately with PHP memory limits lately:

Out of memory (allocated 22544384) (tried to allocate 232 bytes)

<
6条回答
  •  北荒
    北荒 (楼主)
    2020-12-09 03:16

    Website "IF !1 0" provides a simple to use MemoryUsageInformation class. It is very useful for debugging memory leaks.

    real_usage = $real_usage;
        }
    
        // Returns current memory usage with or without styling
        public function getCurrentMemoryUsage($with_style = true)
        {
            $mem = memory_get_usage($this->real_usage);
            return ($with_style) ? $this->byteFormat($mem) : $mem;
        }
    
        // Returns peak of memory usage
        public function getPeakMemoryUsage($with_style = true)
        {
            $mem = memory_get_peak_usage($this->real_usage);
            return ($with_style) ? $this->byteFormat($mem) : $mem;
        }
    
        // Set memory usage with info
        public function setMemoryUsage($info = '')
        {
            $this->statistics[] = array('time' => time(),
                'info' => $info,
                'memory_usage' => $this->getCurrentMemoryUsage());
        }
    
        // Print all memory usage info and memory limit and 
        public function printMemoryUsageInformation()
        {
            foreach ($this->statistics as $satistic)
            {
                echo "Time: " . $satistic['time'] .
                " | Memory Usage: " . $satistic['memory_usage'] .
                " | Info: " . $satistic['info'];
                echo "\n";
            }
            echo "\n\n";
            echo "Peak of memory usage: " . $this->getPeakMemoryUsage();
            echo "\n\n";
        }
    
        // Set start with default info or some custom info
        public function setStart($info = 'Initial Memory Usage')
        {
            $this->setMemoryUsage($info);
        }
    
        // Set end with default info or some custom info
        public function setEnd($info = 'Memory Usage at the End')
        {
            $this->setMemoryUsage($info);
        }
    
        // Byte formatting
        private function byteFormat($bytes, $unit = "", $decimals = 2)
        {
            $units = array('B' => 0, 'KB' => 1, 'MB' => 2, 'GB' => 3, 'TB' => 4,
                'PB' => 5, 'EB' => 6, 'ZB' => 7, 'YB' => 8);
    
            $value = 0;
            if ($bytes > 0)
            {
                // Generate automatic prefix by bytes 
                // If wrong prefix given
                if (!array_key_exists($unit, $units))
                {
                    $pow = floor(log($bytes) / log(1024));
                    $unit = array_search($pow, $units);
                }
    
                // Calculate byte value by prefix
                $value = ($bytes / pow(1024, floor($units[$unit])));
            }
    
            // If decimals is not numeric or decimals is less than 0 
            // then set default value
            if (!is_numeric($decimals) || $decimals < 0)
            {
                $decimals = 2;
            }
    
            // Format output
            return sprintf('%.' . $decimals . 'f ' . $unit, $value);
        }
    
    }
    

提交回复
热议问题