PHP PDO зависает после назначения переменной - PullRequest
0 голосов
/ 06 января 2020

У нас есть внутренний веб-сайт, на котором мы используем PHP 7.2 и подключаемся к нескольким базам данных с помощью PDO. Одной из баз данных для подключения является Snowflake, для которой мы используем драйвер PDO (см. https://github.com/snowflakedb/pdo_snowflake) и подключаемся через наш веб-прокси.

Пока все хорошо.

НО, как только объект PDO будет назначен новой переменной (в качестве значения или ссылки), выполнение останавливается - на 5 минут - перед продолжением. См. Примеры ниже:

FAST: нет переназначения объекта PDO:

putenv("http_proxy=http://ourproxy:80");
putenv("https_proxy=http://ourproxy:80");

$pdo = new PDO("snowflake:account=myacount;", "myuser", "mypassword");
print(gettype($pdo));
>> it prints: 'object'

HANGS: объект PDO переназначен (он зависает примерно на 5 минут, прежде чем в конечном итоге продолжить):

putenv("http_proxy=http://ourproxy:80");
putenv("https_proxy=http://ourproxy:80");

$pdo = new PDO("snowflake:account=myacount;", "myuser", "mypassword");
$d = $pdo;  // <= THIS LINE WAS ADDED
print(gettype($pdo));
>> it eventually prints: 'object'

HANGS: объект PDO переназначается как эталонный (он висит около 5 минут, прежде чем в конечном итоге продолжить):

putenv("http_proxy=http://ourproxy:80");
putenv("https_proxy=http://ourproxy:80");

$pdo = new PDO("snowflake:account=myacount;", "myuser", "mypassword");
$d = &$pdo;  // <= THIS LINE WAS ADDED
print(gettype($pdo));
>> it eventually prints: 'object'

1 Ответ

1 голос
/ 07 января 2020

Я не уверен, почему, но добавление дополнительного оператора в конце скрипта для очистки переменной $pdo решает проблему

ЭТО СЕЙЧАС БЫСТРО:

putenv("http_proxy=http://ourproxy:80");
putenv("https_proxy=http://ourproxy:80");

$pdo = new PDO("snowflake:account=myacount;", "myuser", "mypassword");
$d = $pdo;
print(gettype($pdo));
$pdo = null;  // <- this line was added
>> it prints: 'object'

Идея пришла от просмотра документации по Snowflake PDO (см. https://github.com/snowflakedb/pdo_snowflake#query), где я увидел, что они «обнуляли» объект PDO в конце скрипта. Я не думал, что это будет иметь значение, но это имело место.

Также документация PDO предлагает закрытие таким образом, см. https://www.php.net/manual/en/pdo.connections.php

I Я до сих пор не уверен, почему, если эта последняя строка отсутствует, то она ТОЛЬКО зависает, если произошла переназначение объекта PDO, не иначе, ну да ладно.

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