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

0

Я пытаюсь подключиться к 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 а также в SetEnv с помощью 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 remote DB, как путем вызова скрипта из CLI, так и из Apache. Системой является Debian 64 бит 7.7. "LogLevel debug" установлен в конфигурации vhost, но ошибки не регистрируются.

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

EDIT: используя gdb и перешагнув процесс веб-сервера apache, который обрабатывает запрос, я получаю эту ошибку:

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

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

  • 0
    Я не эксперт, но я заметил, что вы используете sudo для работы из командной строки. Это может быть проблема с разрешениями? Попробуйте открыть свой браузер как суперпользователь и посмотреть, работает ли он.
  • 0
    @Makketronix Я использую sudo -u www-data, которая запускает команду как пользователь www-data. Дело не в том, чтобы открыть мой браузер с правами SU, а в том, что Apache не отправляет данные. Спасибо!
Показать ещё 6 комментариев
Теги:
unixodbc
pervasive

2 ответа

1

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

У меня такая же проблема, но с mod_wsgi и python и googled "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

0

Когда я запустил ваш код, я получил сообщение о том, что 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
    Спасибо за ваш комментарий. Я очевидно сделал ошибку, скопировав / вставив свой скрипт здесь. Сценарий, как вы упомянули, с odbc_result_all ($ подготовлено). Я отредактировал вопрос, чтобы отразить ваш ответ. Тем не менее, проблема остается: она запускается из командной строки (вывод таблицы HTML), но не из Apache.
  • 0
    Вы получаете сообщение "Строки не найдены" или страница полностью пуста? Смотрите мой редактор для "лучшего" тестового сценария.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню