Singleton class not just once instantiated in php

I need a help with a singleton class. I`m creating a wordpress plugin, and need to have live notifications from server. For that I used AJAX long polling and my code looks like this.

This is a php code used for serving AJAX request and for LOG class which is singleton and called from many different places in project

Read More
    if (isset($_GET['log']) && $_GET['log'] == 'true')
    {
    $response = array();
    $response['msg'] = SI_log::get_instance()->get_message();
    $response['type'] = 'something';
    echo json_encode($response);
}

class SI_log{
    private $log_messages = array();
    private static $instance = NULL; 
    private $log_file;

    public static function get_instance()
    {
        if (static::$instance === NULL) {
            static::$instance = new static();
        }
        return static::$instance;
    }

    public function add_message( $message, $type )
    {
        array_push($this -> log_messages, $message);          
    }

    public function get_message()
    {
        return end($this->log_messages);
    }}?>

This is javascript for retrieving notifications and its a part of admin section in the wordpress.

<script type="text/javascript" charset="utf-8">
        function waitForMsg(){
            setTimeout(waitForMsg,5000);
            document.getElementById("alerts").childNodes = new Array();
            var request = new XMLHttpRequest();
            request.open('GET', '<?php echo get_site_url() . '/wp-content/plugins/si/admin/c-si-log.php?log=true'?>', true);
            request.onload = function() {
                if (request.status >= 200 && request.status < 400) {
                    var resp = request.responseText;
                    alert(resp);
                    var json = eval('('+resp+ ')');
                    document.getElementById("alerts").innerHTML= json['type'] +"<hr>";
                    if (json['type'] == 'WARNING'){
                        var html_element = '<div class="alert-message warning" id = "alert_warning"><div class="box-icon"></div><p>'+json['msg']+'</p></div>';
                    }
                    if (json['type'] == 'INFO'){
                        var html_element = '<div class="alert-message info" id = "alert_info"><div class="box-icon"></div><p>'+json['msg']+'</p></div>';
                    }
                    if (json['type'] == 'ERROR'){
                        var html_element = '<div class="alert-message errorr" id = "alert_error"><div class="box-icon"></div><p>'+json['msg']+'</p></div>';
                    }
                    document.getElementById("alerts") . innerHTML= html_element;

                }else{
                    alert('<?php echo get_site_url() . '/wp-content/plugins/si/admin/c-si-log.php?log=true' ?>');
              }


            };
            request.onerror = function() {
              // There was a connection error of some sort
                alert("request isnt good");
            };
            request.send();
        }
        window.onload = function (){
            if (document.readyState != 'loading'){
                waitForMsg();
            } else {
                document.addEventListener('DOMContentLoaded', waitForMsg);
            }
        }
</script>

This is how is singleton class called from another class for notification input

SI_log::get_instance()->add_message("action triggered", 'INFO');

I assume the problem is singleton pattern implementation in SI_log class, so there is not only one instance of that class but many more, and when i try to retrieve the notification ie. when I trigger some action, notification isn`t stored in the same object. I used alert(resp); in cilent page to display response and response looks like this

{
"msg":false, 
"type":"something"
} 

and in log.php you can see that the type value is fine, so it’s not communication problem. Can anyone help me please?

NOTE: I must use Javascript because versioning problems so don’t ask me why i didn’t use JQuery

Related posts

Leave a Reply

1 comment

  1. The singleton pattern is useful when we need to make sure we only have a single instance of a class for the entire request lifecycle in a web application.

    So, you can’t do the thing you want to achieve in this way.

    Instead, use it as a base/parent class and extend it on other classes when you need it.