PHP Fatal error reduced memory size

I am writing a codeigniter application, after making the request, I get the following fatal error.

Fatal error: Allowed memory size 134217728 bytes exhausted allocate 262144 bytes) in / var / www / html / cryd / _zcore / core / Loader.php on line 262

I could increase the allowed memory size, but it seems like the problem could be much more serious, if it was a memory leak, I would just give php more memory to play with. The query is not even that intense, it just returns one row of data.

Here is my controller

    <?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Invest_webhook extends CI_Controller {


    private $web_msg = null;
    private $proceed = 1;
    private $data = null;
    private $receive = null;
    private $complete = 0;
    private $member = null;
    private function loadPage($page,$data=null){
        $data = array_merge($data,$this->lang->language);
        $this->parser->parse('dashboard/header',$data);
        $this->parser->parse('dashboard/'.$page);
        $this->parser->parse('dashboard/footer');
    }

    public function webhook(){
        echo memory_get_peak_usage()."<br/>";
        //$update = file_get_contents("php://input");
        //$update = json_decode($update,true);

        $update = array(
            'notification_id' => '57233292b6a3d133e9c83822',
            'delivery_attempt' => 1,
            'type' => 'address',
            'data' => Array(
                'network' => "BTCTEST",
                'address' => '2N1jfZt8Uc721FAWNjdVpQZjfTxeG271RKy',
                'balance_change' => 1.00000000,
                'amount_sent' => 0.00000000,
                'amount_received' => 1.00000000,
                'txid' => '',
                'confirmations' => 4,
                'is_green' => false
            ),
            'created_at' => 1497176944
        );

        $data = $this->get_investment_data($update['data']['address']);
        if(!$data){
            die('This address does not exist');
        }

        $this->data = $data[0];
        $this->member = $this->get_member_data($this->data['tid']);

        //Start the process to verify transaction and credit investment
        $this->verify_investment();
        $this->update_investment();

        //$parameter = $this->web_msg;
        //include APPPATH."libraries/telegrambotv2.php";
        //$bot = new Telegram('331263599:AAEpHNAdyN1X5TenBk_QkJdt7xfwzDI6YeQ','bot');

        echo $this->web_msg."<br/>";        
    }

    private function verify_investment(){
        include APPPATH."/libraries/BlockIo.php";
        $this->load->config('block');
        $block = new BlockIo($this->config->item('api_token'),$this->config->item('api_secret'));
        $address = ($this->data['address']);
        $receive = $block->get_address_balance(array('addresses' => $address));

        $receive = $receive->data->available_balance;


        $expect = $this->data['inv'];

        settype($receive,'float');
        settype($expect,'float');
        echo '<br/>'.$receive."<br/>".$expect."<br/>";
        if($receive == $expect){

            $this->receive = $receive;
            return true;
        }
        $this->proceed = 0;
        $this->web_msg = 'inv_mismatch';
        return false;
    }

    private function get_member_data($tid){
        $this->load->model('invest_model','invest');
        return $this->get_member_data($tid);
    }

    private function update_investment(){
        if(!$this->proceed){
            return;
        }
        $this->load->model('invest_model','invest');

        $einv = $this->member['inv'];


        settype($einv,'float');

        $new_inv = $einv + $this->receive;
        $this->member['inv'] = $new_inv;
        $this->member['last_inv'] = 'NOW()';
        $this->data['confirmed'] = 1;

        if($this->invest->update_investment($this->data,$this->member)){
            $this->web_msg = 'inv_complete';
            $this->complete = 1;
            return true;
        } else {
            $this->proceed = 0;
            $this->web_msg = 'inv_unx_err';
            return false;
        }
    }

    private function get_investment_data($address){
        $this->load->model('invest_model','invest');
        return $this->invest->investment_data($address);
    }

    private function log($text){
        $file = fopen(APPPATH."/logs/investments/log.log",'a');
        fwrite($file,$text);
        fwrite($file,"\n");
        fclose($file);
    }
}

      

and here is my model

    <?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Invest_model extends CI_Model {
    public function __construct(){
        parent::__construct();
    }

    public function investment_data($address){
        $this->db->where('address',$address);
        $this->db->where('confirmed',0);
        $f = $this->db->get('investments');
        return $f->result_array();
    }

    public function current_investment($tid){
        $this->db->select('inv');
        $this->db->where('tid',$tid);
        $f = $this->db->get('users');
        $f = $f->row_array();
        return $f;
    }

    public function get_member_data($tid){
        echo "<hr/>";
        echo memory_get_peak_usage()."<br/>";
        $this->db->where('tid',$tid);
        echo memory_get_peak_usage()."<br/>";
        $f = $this->db->get('users');
        echo memory_get_peak_usage()."<br/>";
        return $f->row_array();
    }

    public function update_investment($inv,$member){
        $this->db->trans_begin();
        $this->db->set($inv);
        $this->db->where('address',$inv['address']);
        $this->db->update('investments');
        $this->db->set($member);
        $this->db->where('tid',$member['tid']);
        $this->db->update('users');
        if($this->db->trans_status() === FALSE){
            $this->db->trans_rollback();
            return false;
        } else {
            $this->db->trans_commit();
            return true;
        }
    }

}

      

I'm not concerned with where I can optimize this further, its quite simple and straight forward, if this is a problem in my logical judgment, hopefully a better mind than mine can define and continue me.

Thanks in advance.

+3


source to share


4 answers


Place this line in your index.php codeigniter. Thus, it will affect the entire project.

ini_set('memory_limit', '-1');

      



Note. It's just a quick fix. This error was not resolved in php itself.

+3


source


Your code looks great. Check if any function is called again.

you can use

ini_set('memory_limit', '-1');

      

as a temporary solution. or just increasememory_limit

Chceck you php.ini

file. If it is in the form below,



memory_limit=8G

      

Change this to MB form

memory_limit=8192M

      

You can also do this in your code like

ini_set('memory_limit', '8192M'); 

      

+3


source


If you want to know where memory goes, you should look into PHP memory profiling: PHP Memory Profiling

Personally, I would just increase PHP max_memory to 256MB and see if that's enough;)

0


source


The problem arises because the private method kept calling itself over and over until the allocated memory is exhausted and the script stops executing

private function get_member_data($tid){
    return $this->get_member_data($tid);
}

      

This is a silly human error, the above method should be rewritten below

private function get_member_data($tid){
//Call to model method
    return $this->invest->get_member_data($tid);
}

      

Sorry, thanks everyone.

0


source







All Articles