PHP odbc_pconnect мертвые коннекты

Andrew.V.S.

Новичок
PHP odbc_pconnect мертвые коннекты

Есть PHP 5.1.1 + Apache 2.4 на Win и SQL сервер Sybase ASE 12.5
Есть odbc_pconnect к БД, и все работает отлично до тех пор, пока коннект не прибивается со стороны сервера. Вот тут и начинаются проблемы: PHP не распознает, что коннект больше не валиден, и пытается его использовать, на что получает вполне вразумительное сообщение об ошибке.
Вопросов, как водится, два: кто виноват и что делать? :)

1. Кто виноват?
Т.е. это PHP не проверяет валидность коннекта (хотя опция odbc.check_persistent = On) или это драйвер нагло врет?

2. Что делать?
Как можно управлять persistent connect`ами из скрипта?
Делать ему odbc_close() - не помогает :(

Может, есть какое-то расширение, которое позволяет работать с pconnect`ами: перечислить их, узнать параметры, состояние и т.п. ?

Sorry, если вопрос не нов, но ни Google ни Yandex не дали мне на него ответа.
 

tony2001

TeaM PHPClub
>Т.е. это PHP не проверяет валидность коннекта (хотя опция odbc.check_persistent = On)
это точно? что в phpinfo() ?

>это драйвер нагло врет?
и такое может быть.

>Что делать?
выяснять кто виноват.

>Как можно управлять persistent connect`ами из скрипта?
никак.

>Делать ему odbc_close() - не помогает
ясное дело, он на то и persistent.

>Может, есть какое-то расширение, которое позволяет работать с pconnect`ами:
>перечислить их, узнать параметры, состояние и т.п. ?
нет.
и что бы это дало? "есть один коннект к MySQL с параметрами xxx и yyy"?

лучше всего - взять нормальную операционную систему, собрать PHP с --enable-debug и посмотреть в GDB что происходит в void odbc_do_connect() при нахождении дохлого коннекта.
 

Andrew.V.S.

Новичок
>>Т.е. это PHP не проверяет валидность коннекта (хотя опция odbc.check_persistent = On)
>это точно? что в phpinfo() ?
да. в phpinfo() то же.

>>Что делать?
>выяснять кто виноват.
Вот, что удалось найти:
http://bugs.php.net/bug.php?id=20298

Если я правильно понимаю, то:
* PHP при валидации некорректно (по понятиям некоторых драйверов) запрашивает его состояние;
* под правильными OS драйвера отдают правильное состояние;

>>Делать ему odbc_close() - не помогает
>ясное дело, он на то и persistent.
Кстати, методом тыка, получилось, что когда odbc_exec() через убитый коннект возвращает ошибку, odbc_close() позволяет избавиться от дохлого коннекта в пуле. А потом можно создать новый коннект.
Не красиво, но работает. И odbc_error(), как мне кажется, не совсем адекватно себя ведет; или я ее не правильно понимаю :)
Но пока на этом и остановимся.

Спасибо за помощь :)
 

tony2001

TeaM PHPClub
>Вот, что удалось найти:
>http://bugs.php.net/bug.php?id=20298
и что, патч помогает?
насколько я вижу, майнтейнер воспроизвести это так и не смог.
 

Andrew.V.S.

Новичок
Автор оригинала: tony2001
>Вот, что удалось найти:
>http://bugs.php.net/bug.php?id=20298
и что, патч помогает?
насколько я вижу, майнтейнер воспроизвести это так и не смог.
Тем не менее это похоже на правду.

А по поводу патча - я не буду пересобирать php под Win, рискуя наплодить своих багов от неправильного задания дефайнов, версий библиотек и т.п. Как-то лень.
Есть обходное решение - и ладно.
 

tony2001

TeaM PHPClub
А. Ну стандартное поведение виндозных пользователей.
Есть некий ректальный метод решения и ладно..
 
Сверху