2017-07-10 5 views
3

Ich schreibe eine Codeigniter-Anwendung, bei einer Abfrage bekomme ich mit dem folgenden schwerwiegenden Fehler.PHP Schwerwiegender Fehler erlaubt Speichergröße erschöpft

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

Ich konnte die zulässige Speichergröße erhöhen, aber es scheint, dass das Problem könnte viel mehr Stichel, sein, dass, wenn es sich um ein Speicherleck ist, würde ich nur php mehr Speicher werden geben zu spielen, um. Die Abfrage ist nicht einmal so intensiv, sie gibt nur eine Datenzeile zurück.

Hier ist mein 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); 
    } 
} 

und hier ist mein Modell

<?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; 
     } 
    } 

} 

Ich bin nicht, wo ich diese weiter zu optimieren, seine ziemlich einfach und geradlinig, wenn ihr ein Problem In meinem logischen Approach wird hoffentlich ein besserer Verstand als ich in der Lage sein, mich zu erkennen und zu führen.

Vielen Dank im Voraus.

+0

Ich sehe keine für oder while-Schleifen, die die Ursache sein könnten. Auch rekursive Aufrufe könnten dies verursachen. Was ist die DB-Schicht, die Sie verwenden, z. '$ this-> db-> get' – Adder

+0

@Adder meinst du den Treiber den ich benutze? sein Mysqli. –

+0

Mir war nicht bewusst, dass mysqli "$ this-> db-> where" zu tun hat, ich hätte gedacht, dass dies von einer homogenen DB-Ebene ist. – Adder

Antwort

0

Wenn Sie wissen wollen, wo der Speicher geht man in PHP Speicherprofilierungs aussehen sollte: PHP memory profiling

Persönlich würde ich nur erhöhen die PHP max_memory zu 256 MB und sehen, ob es genug;)

3

diese Linie Put auf der index.php Ihres Codezeichners. So wird es für das ganze Projekt betroffen sein.

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

Hinweis: Dies ist nur eine schnelle Lösung. Dieser Fehler wurde nicht in PHP selbst behoben.

+0

Nun ja, das würde funktionieren, aber ich frage mich nur, ob es etwas in meinem Code ist. Es gibt keine rekursiven Verbindungen zur Datenbank oder irgendetwas. –

+0

Meinst du, du hast keine Ahnung, was dieses Problem verursacht? – phpnerd

+0

Ja, ich weiß nicht, was es verursacht. Es gibt höchstens 3 Aufrufe an die Datenbank, um Informationen von 2-3 Tabellen abzurufen, dann eine Abfrage zum Aktualisieren. Keine davon geschieht rekursiv. Ich muss Flags hinzufügen, um dies zu überprüfen, obwohl –

3

Ihr Code sieht gut aus. Überprüfen Sie, ob eine Funktion wiederholt aufgerufen wird.

könnten Sie

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

als vorübergehende Lösung verwenden. oder erhöhen Sie einfach die memory_limit

Chceck Sie php.ini Datei. Wenn es in dem unten stehenden Formular ist,

memory_limit=8G 

ändern, dass in Form von MB

memory_limit=8192M 

Sie auch im Code tun kann wie

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

Das Problem tritt auf weil sich eine private Methode immer wieder aufruft, bis der zugewiesene Speicher erschöpft ist und das Skript die Ausführung stoppt

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

Dies ist ein dummer menschlichen Fehler, sollte das obige Verfahren, wie unten

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

Sorry, und danken alle.

Verwandte Themen