2016-10-03 5 views
1

У меня есть следующий сценарий:Как предотвратить MySQLi врезаться PHP скрипт, если база данных отсутствует

У меня есть сценарий, который conencts к удаленной базе данных, и все работает хорошо, если удаленная база данных не в автономном режиме или сервер не в сети.

Если база данных/сервер отключен, сценарий использует длительное время для выполнения, что было бы лучшим способом проверить, было ли соединение db успешным до выполнения SQL?

class remote_db{ 

    public $db; 

    public function __construct(){ 

     $this->db = new mysqli("127.0.0.1","usr","pw","database"); 
     $this->db->set_charset("utf8"); 
    } 
} 


$remote_db = new remote_db(); 
if($remote_db){ echo 'hello world';} 
+0

Просто установите тайм-аут для MySQLi http://php.net/manual/en/mysqli.options.php опции 'MYSQLI_OPT_CONNECT_TIMEOUT' – nospor

+0

Что вы хотите сделать, если база данных не доступна? Я имею в виду по-настоящему, а не что насмешливый «мир привет»? –

+0

как этот «простой die()» отличается от того, что «сбой» вы хотите избавиться? –

ответ

-1

Там нет причин, чтобы проверить, если он-лайн или не перед выполнением запроса, так как между временем проверки, и время выполнения запроса, то, возможно, пошел в автономном режиме. Так просто запустите запрос и проверьте наличие ошибок после этого, как вы обычно делаете:

$r = $db->query('...'); 
if ($r === false) throw new Exception('error running query'); 

также проверить на наличие ошибок при создании соединения:

$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db'); 

if ($mysqli->connect_error) { 
    die('Connect Error (' . $mysqli->connect_errno . ') ' 
      . $mysqli->connect_error); 
} 

Вы также можете изменить свойство тайм-аут для уменьшить время ожидания:

$db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5); // Wait for 5 seconds max 
+0

, но есть причина, чтобы проверить, было ли соединение успешным. –

+0

Хорошая точка, я упомянул, что –

+0

Таким образом, вы делаете что-то противоположное тому, что задали операторы - сбой сценария, а также выявление внутренних систем для пользователя –

0

Я полагаю, что, наконец, мне удалось получить то, что вы имеете в виду под «сбой».

Кажется, что ваша структура кода - это спагетти, где HTML смешивается с материалом базы данных и т. Д. Ошибка показывает неполный, вырванный дизайн.

Чтобы предотвратить это, вам необходимо правильно структурировать ваше приложение PHP.

Прежде всего, никогда не выводите один байт, если не все операции с базой данных не завершены. Чтобы сделать это, разделите страницу PHP на две части: одна для взаимодействия с базой данных, которая будет собирать все данные, необходимые для отображения; а другая часть состоит из HTML в основном, который используется для отображения данных.

После этого вы сможете показать страницу с особыми ошибками, если на этапе базы данных возникла ошибка.

Имейте в виду, что улавливание каждой возможной ошибки является либо очень неэффективным, и в то же время невозможным: вы просто не можете предвидеть и обрабатывать каждую ошибку, которая может произойти.

Вместо этого просто создайте простой код, который покажет общую страницу с ошибкой в ​​случае какой-либо ошибки. Для этого, установка обработчика ошибок, как это (код взят из моей статьи The (im)proper use of try..catch):

set_error_handler("myErrorHandler"); 
function myErrorHandler($errno, $errstr, $errfile, $errline) 
{ 
    error_log("$errstr in $errfile:$errline"); 
    header('HTTP/1.1 500 Internal Server Error', TRUE, 500); 
    echo "Server error. Please try again later"); 
    exit; 
} 
Смежные вопросы