PHP pconnect и тестирование соединения не удалось - PullRequest
4 голосов
/ 01 февраля 2011
<?php
$connp = mysql_pconnect("localhost", "root", "password");
echo mysql_stat($connp);
mysql_close($connp);
if(!mysql_ping($connp)){
    echo " false";
}
echo "<br />";

$conn = mysql_connect("localhost", "root", "password");
echo mysql_stat($conn);
mysql_close($conn);
if(!mysql_ping($conn)){
    echo " false";
}
echo "<br />";

?>

Привет всем,

Я проверил php pconnect и подключился.

Выше приведен код, ниже приведен результат.

Время безотказной работы: 697914 Тем: 1 Вопросы: 1530 Медленные запросы: 0 Открыто: 91 Сбросить таблицы: 1 Открыто таблиц: 0 Количество запросов в секунду, в среднем: 0,2 ложно

Время безотказной работы: 697914 Тем: 2 Вопросов: 1530 Медленных запросов: 0 Открытий: 91 Сброс таблиц: 1 Открытых таблиц: 0 Количество запросов в секунду, в среднем: 0,2 false

Как видите, оба эха ложны. Должно быть, pconnect не будет показывать false, не так ли? Поскольку pconnect ожидает тайм-аут. Но факт не такой.

Более того, когда я действительно закрываю $ connp, он не может запросить какой-либо оператор sql. Итак, pconnect точно так же, как connect.

Я уже включил постоянное в php.inc. Пожалуйста, скажите мне, что не так у меня. Спасибо всем.

1 Ответ

2 голосов
/ 01 февраля 2011

В большинстве случаев нет причин использовать mysql_close () в сочетании с постоянными соединениями, но ниже приводится некоторое объяснение.

Прежде всего, вы должны сделать различие между ресурсом (переменная PHP, внутренне: zval) и соединение (например, соединение TCP или сокета, также называемое «ссылкой»).

Когда вы вызываете mysql_connect (), новый соединение создается каждый раз, и возвращается новый ресурс .Несколько вызовов mysql_connect () в одном и том же скрипте создадут несколько соединений, и будет возвращен соответствующий ресурс.

Когда вы вызываете mysql_pconnect (), создается новое соединение если в текущем процессе PHP не найдено активное постоянное соединение и каждый раз также возвращается новый ресурс .Многократные вызовы mysql_pconnect () вернут разные ресурсы , которые все указывают на одно и то же соединение .

mysql_close () будут действовать как на соединение и ресурс :

  1. Если соединение, указанное ресурсом, является , а не постоянным, соединение закрывается.
  2. Ресурс уничтожается в каждом случае.

Это означает, что при использовании mysql_close () для постоянного соединения у вас больше нет возможности использовать соединение, даже если этоодин еще открыт, вы можете отладить его с помощью:

<?php
$connp = mysql_pconnect("localhost", "root", "password");
mysql_close($connp);
sleep(60);
?>

и, глядя в MySQL, что соединение все еще активно:

SHOW PROCESSLIST;

Если в вашем сообщении об ошибке включены предупреждения, вымог бы увидеть сообщение вроде:

Warning:  mysql_ping(): 4 is not a valid MySQL-Link resource in ... on line ...

Единственный способ использовать ранее созданное постоянное соединение - это снова создать новый ресурс , который будет указывать на него:

$connp = mysql_pconnect("localhost", "root", "password");

Использование mysql_thread_id ()ресурс предоставит вам идентификатор соединения MySQL, так что вы можете быть уверены, что mysql_close () действительно не закрывает постоянное соединение, а только уничтожает ресурс:

<?php
$conn = mysql_connect("localhost", "root", "password");
echo mysql_thread_id($conn), "\n";
mysql_close($conn);

$connp1 = mysql_pconnect("localhost", "root", "password");
echo mysql_thread_id($connp1), "\n";
mysql_close($connp1);

$connp2 = mysql_pconnect("localhost", "root", "password");
echo mysql_thread_id($connp2), "\n";
mysql_close($connp2);
?>

Это выдаст что-то вроде:

61
62
62
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...