LINUX.ORG.RU

не получается подключиться к БД oracle из пхп


0

0

помогите пожалуйста разобраться.

у меня linux debian. я написал пхп-скрипт. он простейший, содержит примерно такой код:

if ($c=OCILogon("xyz", "xyz11", "asd"))
{
echo "Successfully connected to Oracle.<br>";
}
else
{
$err = OCIError();
echo "Oracle Connect Error " . $err[message];
exit;
}

если его запускать вручную из командной строки, то проблем нет, отрабатывает. но когда я прописываю задание в cron, то этот скрипт выдаёт такую ошибку: ORA-12154: TNS:could not resolve the connect identifier specified (она записывается в файл /var/spool/<login>)

вероятно какой-то переменной окружения присвоено значение asd. (здесь asd это не ip-адрес, а псевдоним)

хочу спросить как мне добраться до этой переменной. или может быть возможно в том же кроне перед выполнением моей пхп-программы пинать логин-скрипт пользователя, от кого рого эта программа запускается? как это сделать я не представляю...

есть ли еще какие-нибудь способы решить мою проблему?

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

заранее благодарен за ответы



Последнее исправление: cyklop77 (всего исправлений: 1)

в tnsnames, я надеюсь, эти твои asd присутствуют?

name_no ★★
()

OCI ищет tnsnames.ora в следующих местах:
1. $ORACLE_HOME/network/admin/tnsnames.ora
2. $TNS_ADMIN/tnsnames.ora
Когда твой скрипт срабатывает по крону, ни одна из переменных - ни ORACLE_HOME, ни TNS_ADMIN не установлена, следствие ты привел в сообщении об ошибке.

Nastishka ★★★★★
()

Сделай env > /tmp/cron-env из крона и env > /tmp/console-env из консоли, где твой скрипт работает. Посмотри различие у файлов.

Lumi ★★★★★
()
Ответ на: комментарий от Nastishka

> ни ORACLE_HOME, ни TNS_ADMIN не установлена, следствие ты привел в сообщении об ошибке.

Где по-твоему ищутся сами эти сообщения об ошибках? Как человеку подсказали на LOR-NG, скорее всего ORACLE_HOME определена, только указывает в неправильное место.

anonymous
()
Ответ на: комментарий от anonymous

Как человеку подсказали на LOR-NG, скорее всего ORACLE_HOME определена, только указывает в неправильное место.

Можете смело идти обратно на свой LOR-NG и рыдать вместе со «специалистами», поскольку что переменная определена но неправильно, что переменная вообще не определена - с точки рения клиента это одно и то же (не найден tnsnames.ora). С учетом же осбенностей поведения cron, переменная скорей всего именно не определена, чем «определена неправильно».

Где по-твоему ищутся сами эти сообщения об ошибках?

Где бы они не искались, ORACLE_HOME для этого не обязателен.

$ ./sqlplus user/password@dbname

SQL*Plus: Release 10.2.0.2.0 - Production on Mon Jun 28 22:59:12 2010

Copyright (c) 1982, 2005, Oracle.  All Rights Reserved.

ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified


Enter user-name: user
Enter password: 
ERROR:
ORA-12162: TNS:net service name is incorrectly specified


Enter user-name: user
Enter password: 
ERROR:
ORA-12162: TNS:net service name is incorrectly specified


SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus
$ echo $ORACLE_HOME

$

Так что идите обратно на LOR-NG и изучайте матчасть :-)

Nastishka ★★★★★
()
Ответ на: комментарий от Nastishka

Я в этом вашем Оракле, конечно, плохо разбираюсь, но то, что написали на LOR-NG лучше соответствует моим собственным наблюдениям нежели то, о чём пишешь ты:

[code] $ sqlplus scott/tiger@orcl

SQL*Plus: Release 11.2.0.1.0 Production on Mon Jun 28 19:01:24 2010

Copyright (c) 1982, 2009, Oracle. All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> quit Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options

$ ##### reset ORACLE_HOME ##### $ export ORACLE_HOME=

$ sqlplus scott/tiger@orcl Error 6 initializing SQL*Plus SP2-0667: Message file sp1<lang>.msb not found SP2-0750: You may need to set ORACLE_HOME to your Oracle software directory $

[/code]

anonymous
()
Ответ на: комментарий от anonymous

> Я в этом вашем Оракле, конечно, плохо разбираюсь

Тогда идите учиться дальше, чтобы «разбираться хорошо» в этом нашем оракле :-)

Nastishka ★★★★★
()
Ответ на: комментарий от Nastishka

> Тогда идите учиться дальше, чтобы «разбираться хорошо» в этом нашем оракле :-)

Большое вам спасибо за совет, а не подскажете куда именно идти? Вот например вас где так хоро научили разбираться в Оракле, что он у вас файлы локали находит даже не зная где он собственно установлен?

anonymous
()
Ответ на: комментарий от Lumi

из крона почему то не получается...

Nastishka, а нельзя ла написать скрипт, который утсанавливал бы переменные ORACLE_HOME, ни TNS_ADMIN и пинать его перед запуском моего скрипта?

name_no, да присутствуют

cyklop77
() автор топика
Ответ на: комментарий от cyklop77

ORACLE_HOME=... TNS_ADMIN=... /path/to/php /path/to/script

Должно помочь.

sjinks ★★★
()
Ответ на: комментарий от cyklop77

/etc/oracle-env

ORACLE_HOME=/opt/oracle/client10
TNS_ADMIN=/opt/oracle/network/admin
export ORACLE_HOME TNS_ADMIN

~/bin/cron-call.sh

#!/bin/sh

#
# Setup Oracle environment
#
. /etc/oracle-env

#
# Call PHP script
#
php ~/public_html/project/on-cron.php

Обратите внимание на export в первом файле - он важен.

Собственно по крону вызывается второй скрипт.

Nastishka ★★★★★
()
Ответ на: комментарий от Nastishka

> для сборки PHP-OCI достаточно instant client

Теперь следующий вопрос - из того, что тебе этого достаточно, следует ли делать вывод что у топик-стартера стоит instant client?

anonymous
()
Ответ на: комментарий от anonymous

следует ли делать вывод что у топик-стартера стоит instant client?

Если у топикстартера стоит «стандартный» клиент, и ORACLE_HOME не установлена или установлена неправильно (а это равнозначно) то сообщение об ошибке выглядит примерно так:

$ export ORACLE_HOME=/bad/directory
$ tnsping dbname
TNS Ping Utility for Linux: Version 9.2.0.7.0 - Production on 29-JUN-2010 21:18:00
Copyright (c) 1997 Oracle Corporation.  All rights reserved.
Message 3511 not found; No message file for product=network, facility=TNSTNS-03505: Message 3505 not found; No message file for product=network, facility=TNS
$
Если у топикстартера стоит Instant Client и ORACLE_HOME не установлена, или установлена неправильно, сообщение об ошибке выглядит так:
$ export ORACLE_HOME=/bad/directory
$ /opt/oracle/client10/bin/sqlplus user/password@dbname
SQL*Plus: Release 10.2.0.2.0 - Production on Tue Jun 29 21:23:11 2010
Copyright (c) 1982, 2005, Oracle.  All Rights Reserved.
ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified
Так что у топикстартера стоит instant client. Идите читайте документацию или хотя-бы FAQ, ссылку я вам уже приводила выше.

Nastishka ★★★★★
()
Ответ на: комментарий от Nastishka

> Идите

Большое спасибо за рекомендацию. Теперь следующий вопрос - а как бы выглядела симтоматика, если бы у него ORACLE_HOME присутствовал и указывал бы на домашнюю директорию сервера. Только на какую-нибудь другую?

anonymous
()
Ответ на: комментарий от anonymous

Идите да проверьте. Сервер всегда содержит «обычный» клиент (база создается через SQLPLUS, да и инстанс стартует через него же, в нем же делается воссатновление и т.п.).

Для «обычного» клиента поведение в общем случае не определено, каждая утилита ведет себя по-разному. tnsping например работает в любой расстановке, как «новый» tnsping на «старый» ORACLE_HOME (хотя и с воплями про «Message .. not found»), так и «старый» tnsping на «новый ORACLE_HOME».

«Старый» sqlplus на «новый» сервер стартует, но ругается и падает, «новый» sqlplus на «старый» сервер как правило «падает», как и большинство других оракловских утилит, но сообщения там вида ORA-01821: date format not recognized или SP2-0152: ORACLE may not be functioning properly.

В случаях прибегания к OCIError() в текстах ошибок практические всегда вылетает «Message ... not found», либо лезут проблемы с форматами даты, чисел и т.п., а это не те симптомы, что у ТС.

Nastishka ★★★★★
()
Ответ на: комментарий от Nastishka

Надеюсь, вВопросы по поводу того, что же именно стоит у ТС теперь отпали?

Nastishka ★★★★★
()
Ответ на: комментарий от Nastishka

> Идите

Большое вам спасибо за полезный совет.

это не те симптомы, что у ТС

Неужели в самом деле не те? У одного юзера среда настроена на использование одного клиента, у другого - на использование другой версии установленной там же. Приложение запускается и не обнаруживает ничего странного, ну за исключением другого tnsnames.ora, который может и не содержать искомого алиаса. Мне об этом в детстве бабушка рассказывала и всегда при этом добавляла: «внучек, перед тем как решать проблему, не забывай сначала разобраться с причиной».

anonymous
()
Ответ на: комментарий от anonymous

Угу, у топикстартера хватило ума
1. поставить две версии клиента, каждую для своего юзера
2. каждому юзеру он осилил прописать индивидуальное работающее окружение (ORACLE_HOME, NLS_LANG и пр.)
И вдруг он «забывает» что у него разные клиенты, и «не догадывается» сделать tnsping или коннект через sqlplus из под обоих пользователей? Вы сами то в это верите?

Nastishka ★★★★★
()
Ответ на: комментарий от Nastishka

> Вы сами то в это верите?

Наличие нескольких версий клиентского ПО на одном сервере - это вполне распространённая ситуация в организациях. Не вижу в этом ничего странного или удивительного.

anonymous
()
Ответ на: комментарий от anonymous

> Наличие нескольких версий клиентского ПО на одном сервере - это вполне распространённая ситуация в организациях

А также в таких случаях есть единый tnsnames, указаный в TNS_ADMIN, и как правило, есть еще и достаточно хорошо подготовленый администратор БД, который эту проблему расщелкает за три минуты, вследствие чего этот топик не появился бы тут.

Nastishka ★★★★★
()
Ответ на: комментарий от Nastishka

> в таких случаях есть единый tnsnames

Может и есть, а может и нет. Как знать. Если клиенты разных версий стоят для работы с серверами разных версий - совершенно необязательно, что они будут иметь общий tnsnames. Если клиенты стоят чтобы изолировать пользовательские окружения - скорее всего tnsnames'ы у них будут у каждого свои. Если другое окружение было настроено под другим юзером при царе горохе, а потом на машине тупо поставили клиента более свежей версии и заточили на неё среду для разработчика, то опять же не факт что использовали какой-то общий tnsnames. Тем более что хорошо начитавшийся брошюрок с oracle.com DBA на небольшом предприятии может и отсутствовать.

anonymous
()
Ответ на: комментарий от Nastishka

(29.06.2010 13:20:38) Обратите внимание на export в первом файле - он важен.

Собственно по крону вызывается второй скрипт.

сделал почти то же самое: в cron перед заданием написал задал значения следующим переменным.

ORACLE_HOME=/home/oracle/ora/9
TNS_ADMIN=/home/oracle/ora/9/network/admin
ORACLE_SID=bla
ORACLE_BASE=/home/oracle/ora
LOGNAME=bla

спасибо всем

cyklop77
() автор топика

опять я наступаю на похожие грабли и прошу помощи. дело в следующем: есть php-скрипт. он заносит в БД mysql несколько сотен строк. если запускаю запускаю его из ком.строки - проблем нет, отрабатывает. если его запускает cron, то тоже отрабатывает, но русские символы заносятся в таблицу БД в виде знаков вопроса. можно ли как и в предыдущем случае прописать что-то в кроне перед командой запуска скрипта? что еще можно сделать?..

cyklop77
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.