WordPress.org

Make WordPress Core

Ticket #5932: wp-mysql-ping.php

File wp-mysql-ping.php, 2.5 KB (added by Mrasnika, 6 years ago)

This plugin is designed to help you deal with the "MySQL Server Has Gone Away" error.

Line 
1<?php
2/*
3Plugin Name: MySQL Ping
4Plugin URI: http://kaloyan.info/blog/wp-mysql-ping-plugin/
5Description: This plugin is designed to help you deal with the "MySQL Server Has Gone Away" error.
6Author: Kaloyan K. Tsvetkov
7Version: 0.1
8Author URI: http://kaloyan.info/
9*/
10
11/////////////////////////////////////////////////////////////////////////////
12
13/**
14* @internal prevent from direct calls
15*/
16if (!defined('ABSPATH')) {
17        return ;
18        }
19
20/**
21* @internal prevent from second inclusion
22*/
23if (!class_exists('wpdb2')) {
24
25/////////////////////////////////////////////////////////////////////////////
26
27/**
28* "MySQL Ping" WordPress Plugin
29*
30* Extend the default {@link wpdb} class by
31* adding {@link mysql_ping()} capabilities
32*
33* @author Kaloyan K. Tsvetkov <kaloyan@kaloyan.info>
34* @license http://opensource.org/licenses/gpl-license.php GNU Public License
35*/
36Class wpdb2 Extends wpdb {
37
38        /**
39        * Attemp to ping the MySQL server
40        */
41        function _ping() {
42
43                $retry = 5;
44                $failed = 1;
45       
46                // probe w\ a ping
47                //
48                $ping = mysql_ping( $this->dbh ) ;
49                while( !$ping && $failed < $retry) {
50
51                        //$this->print_error('No ping go MySQL server');
52                       
53                        // reconnect
54                        //
55                        $this->dbh = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD, 1);
56                        $this->select(DB_NAME);
57
58                        if ( !DB_CHARSET && version_compare(mysql_get_server_info($this->dbh), '4.1.0', '>=')) {
59                                $this->query("SET NAMES '" . DB_CHARSET . "'");
60                                }
61                       
62                        // ping again to check the result
63                        //
64                        $ping = mysql_ping( $this->dbh ) ;
65                        if(!$ping ) {
66                                sleep(2);
67                                $failed+=1;
68                                }
69                        }
70       
71                // yet no result ...
72                //
73                if(!$ping ) {
74                        $this->print_error(
75                                'Attempted to connect for '
76                                        . $retry
77                                        . ' but failed...'
78                                );
79                        }
80                }
81
82        // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
83
84        /**
85        * Override the original {@link wpdb::query()} method in
86        * order to ping the server before executing every query
87        *
88        * @param string $query
89        * @return mixed
90        */
91        function query($query) {
92                $this->_ping();
93                return parent::query($query);
94                }
95
96        //--end-of-class--
97        }
98
99/////////////////////////////////////////////////////////////////////////////
100
101        // create new object, and copy all object's properties
102        //
103        $wpdb2 = new wpdb2(DB_USER, DB_PASSWORD, DB_NAME, DB_HOST);
104        foreach(get_object_vars($wpdb) as $k=>$v) {
105                if (is_scalar($v)) {
106                        $wpdb2->$k = $v;
107                        }
108                }
109        $wpdb =& $wpdb2;
110
111/////////////////////////////////////////////////////////////////////////////
112
113}
114
115?>