ODBC-соединение работает через командную строку, а не через apache

Я пытаюсь подключиться к Pervasive 11 DB в удаленной системе с помощью PHP. DSN настраивается в /etc/odbc.ini. Пользователь psql (созданный установщиком Pervasive client) и пользователь www-data могут подключиться к удаленной системе с помощью

isql -v remote

Кроме того, пользователь www-данных добавляется в группу pvsw, а необходимые переменные среды PVSW_ROOT и LD_LIBRARY_PATH устанавливаются в /etc/apache2/envvars а также в Vhost с помощью SetEnv,

Мой PHP-скрипт выглядит следующим образом:

<?php
$connect = odbc_connect("remote", "", "") or die("Could not connect");
$query = "SELECT * FROM \"ITEMS\"";
$prepared = odbc_prepare($connect, $query);
$result = odbc_execute($prepared);
odbc_result_all($prepared);

Скрипт работает нормально из командной строки:

sudo -u www-data /usr/bin/php /var/www/odbc.php

и результаты, как и ожидалось.

Тем не менее, доступ к http://example.org/odbc.php в результате получается пустая страница, и никакие данные не отправляются из Apache (проверено с помощью wget и Chrome). С помощью tcpdump показывает соединение между сервером и удаленной базой данных Pervasive, вызывая скрипт из CLI как из Apache. Система Debian 64 бит 7.7. ‘LogLevel debug’ установлен в конфигурации vhost, но ошибки не регистрируются.

Почему Apache не возвращает никаких данных?

РЕДАКТИРОВАТЬ:
с помощью gdb и проходя через процесс веб-сервера apache, который обрабатывает запрос, я получаю эту ошибку:

Program received signal SIGSEGV, Segmentation fault.
0x00007ff48c68ea2f in ErrStmtWithState () from /usr/local/psql/lib64/libodbcci.so

Похоже, ошибка, нет?

0

Решение

Вероятно, ошибка: http://cs.pervasive.com/forums/p/14802/53328.aspx.

Я получил ту же проблему, но с mod_wsgi и python и погуглил «ErrStmtWithState», чтобы попасть сюда. Мое (далеко не оптимальное) решение было вдохновлено https://serverfault.com/questions/451220/psql-64bit-driver-error. Я создал следующий сценарий оболочки:

#!/bin/bash
PVSW_ROOT=/usr/local/psql
PATH=$PATH:$PVSW_ROOT/bin:/bin:/usr/bin
LD_LIBRARY_PATH=$PVSW_ROOT/lib64:$PVSW_ROOT/bin:/usr/lib
MANPATH=$MANPATH:$PVSW_ROOT/man
export PVSW_ROOT
export LD_LIBRARY_PATH

python wrapper.py "$@"

Где «wrapper.py» запускает запрос к dsn, переданному в качестве аргумента, и выводит сериализованный набор результатов:

import pyodbc
import cPickle
import sys, getopt

def main(argv):
dsn = ''
query = ''
hm = 'usage: wrapper.py -d <dsn> -q <query>'
try:
opts, args = getopt.getopt(argv,"hd:q:",["dsn=","query="])
except getopt.GetoptError:
print hm
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print hm
sys.exit()
elif opt in ("-d", "--dsn"):
dsn = arg
elif opt in ("-q", "--query"):
query = arg

cnxn = pyodbc.connect('DSN='+dsn)
cursor = cnxn.cursor()
cursor.execute(query)
rows = cursor.fetchall()
print(cPickle.dumps(rows))

if __name__ == "__main__":
main(sys.argv[1:])

Переменные среды, скопированные из всеобъемлющей документации:
http://docs.pervasive.com/products/database/psqlv10/wwhelp/wwhimpl/js/html/wwhelp.htm#href=getstart/unixappconf.15.3.html

1

Другие решения

Когда я запустил ваш код, я получил сообщение о том, что odbc_result_all ожидает, что параметр 1 будет ресурсом.
Когда я изменил это на следующее, это сработало:

<?php
$connect = odbc_connect("remote", "", "") or die("Could not connect.");
$query = "SELECT * FROM \"ITEMS\"";
$prepared = odbc_prepare($connect, $query);
if (!odbc_execute($prepared)) {
die(odbc_errormsg());
}
if (odbc_result_all($prepared) < 1) {
die(odbc_errormsg());
}
?>

Это имеет смысл, потому что odbc_excute объявлен как:

bool odbc_execute ( resource $result_id [, array $parameters_array ] )

а также odbc_result_all объявлен как:

int odbc_result_all ( resource $result_id [, string $format ] )

в PHP документы.

0

По вопросам рекламы [email protected]