XE + oci_connect = ORA-12705: invalid or unknown NLS parameter value specified

Shredder2003

Новичок
XE + oci_connect = ORA-12705: invalid or unknown NLS parameter value specified

дано:
Win XP
Oracle XE Univ
SQL Developer и Toad коннектятся
phpinfo() говорит:
Apache Environment
NLS_LANG AMERICAN_AMERICA.CL8MSWIN1251
ORA_HOME C:\oraclexe\app\oracle\product\10.2.0\server
ORACLE_HOME C:\oraclexe\app\oracle\product\10.2.0\server
ORA_NLS10 C:\oraclexe\app\oracle\product\10.2.0\server/nls/data
ORA_NLS33 C:\oraclexe\app\oracle\product\10.2.0\server/nls/data

на папку C:\oraclexe и всё содержимое выставлены права "Все" для чтения

при попытке коннекта говорит:

Warning: oci_connect() [function.oci-connect]:
ORA-00604: error occurred at recursive SQL level 1
ORA-12705: invalid or unknown NLS parameter value specified in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\constants.php on line 866

Как законнектиться?
P.S. знаю, что если поставлю обычного клиента версии 10, а не XE, то будет работать. Но хотелось бы побороть этот XE, ибо нужно.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
На XE работает только UTF8 и Latin1, другие кодировки работать не хотят. Можно поставить клиентские либы от InstantClient и должно заработать.
 

Shredder2003

Новичок
Врёте, батенька.
Оказывается, устанавливать Apache Environment бесполезно:
нужно устанавливать системные переменные окружения, причём до запуска апаче.
Т.е. после установки переменных стоп-старт службы не помогает, необходима перезагрузка.

Вот так и заработало. Ура!
 

Shredder2003

Новичок
ага, флоппик, заработало с cp1251.
Скажу более: в данный момент есть продакшн система на php+XE, работает (на XE, до этого был 9i) уже более полугода.
Так что XE - рульная вещь для своей ниши :)

P.S. кстати, to tony2001:
в этой системе была проблема с тем, что не хватало свободных дескрипторов при коннекте, или как там листенер ругался.
т.е. параметр max_processes нужно было увеличить.
по умолчанию он 40 стоит, увеличил до 200, особо не разбираясь в причинах (хотя знал, что в этой системе 40 одновременных пользователей-коннектов быть не может)
Изредка периодически повторялось такая бяка. После установки Spotlight for Oracle отмониторил: в некоторых скриптах производился коннект два раза. Так вот, если коннектиться один раз, то после завершения работы скрипта сессия закрывается, а если два раза делать oci_connect, то после завершения работы скрипта сессия продолжала висеть (точнее две сессии), и отрубалась ораклом только по таймауту через несколько десятков минут.
Вот так происходило накопление запущенных процессов.
Я так понимаю, что это бага php_oci8 : он не закрывает соединения после завершения работы скрипта, если соединений больше одного.
версия пхп - 5.2.6
Или это не бага, а имеющая глубинный смысл фича?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Скажу более: в данный момент есть продакшн система на php+XE, работает (на XE, до этого был 9i) уже более полугода.
Так что XE - рульная вещь для своей ниши
Просто скорее всего, они починили это с тех пор, когда я это пробовал :) У нас сейчас стоит 9.2i на старом и 10g на новом сервере.
Я так понимаю, что это бага php_oci8
Кстати, я наблюдал такое поведение, когда это все стояло под виндой (сейчас Suse и Debian). Тогда помогли dll-ки из Zend Core for Oracle
 

tony2001

TeaM PHPClub
судя по этому описанию, какая-то бессмыслица.
все соединения закрываются.

reproduce case есть?
 

Shredder2003

Новичок
вечером дома попробую забабахать.

-~{}~ 20.08.08 21:33:

Прошу прощения, дома у меня версия 5.2.4, а не 5.2.6
Вот:
PHP Version 5.2.4
Apache Version Apache/2.2.6 (Win32) PHP/5.2.4
скрипт:
PHP:
$a = oci_connect('system','syspass','XE');
$b = oci_connect('system','syspass','XE');
запускаем, затем смотрим сессии.
вуаля, висит одна под системом.
десять раз нажмём кнопку "обновить" в браузере, и ещё раз смотрим - уже 11 сессий под этим юзером.
Далее, убиваем эти сессии, изменяем скрипт:
PHP:
$a = oci_connect('system','syspass','XE');
//$b = oci_connect('system','syspass','XE');
и вновь раз десять выполняем его.
только на этот раз никаких сессий не висит.

блин, чё-та тупой какой-то пример получился...
ну вот, набросал покрасивше, никаких мониторов не нужно, скрипт сам скажет:

PHP:
$login = 'SYSTEM'; //uppercase

$conn1 = oci_connect($login,'syspass','XE');
//$conn2 = oci_connect($login,'syspass','XE');

$select = "
select count(*)
from v\$session
where username = '$login'
";

$a = oci_parse($conn1, $select);
oci_execute($a);
if ( oci_fetch($a) ) $count = oci_result($a,1);
else $count = 0;
oci_free_statement($a);

print "кол-во сессий пользователя $login = $count";
вот, если это выполнять, то каждый раз при обновлении страницы выводит одно и то же сообщение.
а стоит раскомментировать строку
PHP:
$conn2 = oci_connect($login,'syspass','XE');
, то каждый раз число увеличивается:
вот у меня дошло до 16 и ... вуаля:

Warning: oci_connect() [function.oci-connect]: ORA-12520: TNS:listener could not find available handler for requested type of server in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\stuff\xxx.php on line 6
ну как, тони, повторяется результат, или у тебя по-другому?

-~{}~ 21.08.08 10:00:

щас на работе прогнал на php 5.2.6, результат повторяется.
 

tony2001

TeaM PHPClub
понял в чем проблема, исправлю.
спасибо за внятное описание.
 
Сверху