Как ресурсы odbc (или mysql) работают в php? - PullRequest
2 голосов
/ 23 декабря 2009

Когда вы запускаете запрос так:

$query = "SELECT * FROM table";
$result = odbc_exec($dbh, $query);
while ($row = odbc_fetch_array($result)) {
    print_r($row);
}

Указывает ли ресурс, хранящийся в $ result, на данные, которые существуют на сервере, на котором работает php? Или указывает на данные в базе данных? Иными словами, поскольку цикл while делает свое дело, PHP взаимодействует с БД на каждой итерации или вытягивает эту строку $ из некоторого источника на стороне приложения?

Для меня важно, что у меня есть база данных, с которой я общаюсь через VPN, используя ODBC с PHP. В прошлые выходные произошло нечто странное, когда во время цикла происходили огромные паузы. Таким образом, между итерациями сценарий останавливает выполнение на секунды и до минут. Кажется, совершенно случайно, где это происходит. Мне интересно, нужно ли мне общаться с сервером через VPN каждую итерацию, и, возможно, соединение нестабильно или что-то не так с моим драйвером ODBC (FreeTDS).

Ответы [ 2 ]

2 голосов
/ 23 декабря 2009

mysql_query и odbc_exec оба возвращают ресурс, который (цитата из php.net ) «является специальной переменной, содержащей ссылку на внешний ресурс». Это говорит о том, что сервер общается с сервером базы данных каждую итерацию, хотя я не уверен.

Однако есть 2 связи, о которых мы здесь говорим. Первая - это ваше соединение с сервером PHP, а вторая - связь между сервером PHP и сервером базы данных. Если оба сервера имеют быстрое соединение, странное поведение, которое вы испытываете, может не иметь никакого отношения к вашей VPN.

1 голос
/ 24 декабря 2009

Ресурс идентифицирует внутреннюю структуру данных, используемую PHP для взаимодействия с внешним ресурсом.

В случае ресурса, возвращаемого mysql_query (), эта структура данных будет включать строки, возвращаемые запросом (и не будет возвращаться, пока не будут возвращены все данные или не произойдет сбой соединения). Однако это поведение специфично для MySQL - не требуется, чтобы СУБД возвращала данные до того, как они будут явно запрошены клиентом.

Если есть какая-то странная проблема, вызывающая большую задержку в вашей настройке, то единственным очевидным решением будет скомпилировать результаты запроса на стороне базы данных, а затем доставить их в код PHP, либо пакетный, либо в целом ( думаю вебсервис).

C.

...