Имя: Пароль:
IT
Веб-мастеринг
PHP + V8.COMConnector: как удержать связь?
0 Salvador Limones
 
15.09.06
14:28
Из PHP соединяюсь с 1С через:
$loggedin=$_POST['user'];
$loggedpasv=$_POST['user_password'];
$serv="...";
$dbase="...";
$app = new COM("V8.COMConnector");
$res = $app->connect("Srvr=$serv;Ref=$dbase;Usr=$loggedin;pwd=$loggedpasv");
Всё нормально, в соединениях вижу нового подключившегося. Но, как только скрипт заканчивает работу, соединение отваливается. Как держать соединение открытым, чтобы пользователь подключившись мог периодически получать остатки?

Если сразу за подключением прописать:
$Запрос = $res->NewObject("Запрос");
$Запрос->Текст =
"ВЫБРАТЬ
   ТоварыНаСкладахОстатки.Номенклатура,
   ТоварыНаСкладахОстатки.КоличествоОстаток
ИЗ
   РегистрНакопления.ТоварыОрганизаций.Остатки(, Номенклатура В ИЕРАРХИИ (&ХозТовары)) КАК ТоварыНаСкладахОстатки";

$Запрос->УстановитьПараметр("ХозТовары", $res->Справочники->Номенклатура->НайтиПоКоду("008332"));
   
$Результат = $Запрос->Выполнить();
$nom = $Результат->Выбрать();

Всё отрабатывает, остатки получаю, но чтобы получить еще раз, нужно опять подключаться, а это время. :-(
1 Ангел- Хоронитель
 
15.09.06
14:42
(0)такое вопрос: а если $res в сессии сохранять?
2 Salvador Limones
 
15.09.06
14:43
(1) Пробовал, нельзя. http://sno.kbtu.kz/eBook/PHP4-rus/manphp4rus/com.htm - 4 вопрос.
3 Ангел- Хоронитель
 
15.09.06
14:46
(2)там написано, что вобще можно в пределах только одного скрипта работать, а потом заново.... можно извратиться и не завершать скрипт.....
4 Salvador Limones
 
15.09.06
14:47
(3) Вот как его не завершать????
5 Ангел- Хоронитель
 
15.09.06
14:48
(4)flush();
6 Ангел- Хоронитель
 
15.09.06
14:49
7 Camino
 
15.09.06
14:49
РНР работает с СОМ-объектами автоматически и влиять на этот процесс из скрипта невозможно. Не завершать скрипт тоже невозможно, разумеется.
Остается только уповать на то, что РНР самостоятельно удержит СОМ-объект в рамках сессии.
8 Ангел- Хоронитель
 
15.09.06
14:50
+(6)правда смутно представляю, как это будет выглядеть....
9 Camino
 
15.09.06
14:51
(4) А вот с отложенным выводом я бы не стал баловаться. Тем более, что это относится только к тексту и никак не затрагивает объекты.
10 Camino
 
15.09.06
14:53
(0) А в твоем случае надо коннектиться каждый раз при запуске скрипта. Не удержишь ты коннект.
И вообще: хотите нормально работать с OLE - пишите на ASP.
11 Salvador Limones
 
15.09.06
14:59
(5)(6) Спасибо, попробую.
(10) Не получится с flush перепишу на ASP.
12 Ангел- Хоронитель
 
15.09.06
15:02
(11)ты лучше Camino слушай в (4).... я c PHP всего месяц дружу....
13 Camino
 
15.09.06
15:02
(11) Не получится, ибо это бред. Нельзя оставлять скрипт бесконечно работающим. Протокол HTTP - не поточный. Тем более, что на большинстве серверов в настройках РНР стоит MaxScriptExecutionTime=60 (в секундах), и через минуту твой скрипт все равно отвалится по таймауту, как зависший.
14 Camino
 
15.09.06
15:04
В общем, я не вижу какой-то проблемы в том, что каждый раз скрипт будет проживать свою жизнь заново, начиная со знакомства с СОМ-сервером :)
16 Salvador Limones
 
15.09.06
15:05
(13) Ага, клёво, всё завесил. :-)
Сейчас на ASP перепишу.
17 Camino
 
15.09.06
15:07
(16) Ты не спеши особо. Не факт, что на ASP получится коннект оставить.
18 Ангел- Хоронитель
 
15.09.06
15:09
(17)а можно вопрос? а другого способа достучаться до баз 1С из PHP нет?
19 Camino
 
15.09.06
15:13
(18) До баз? Есть, конечно. Через ADO, SQLDMO или через штатный РНР-шный объект для работы с MSSQL. Только геморно это - напрямую с базами работать.
20 Steban
 
15.09.06
15:14
в ссылке (2) написано:
11. Можно ли получить работающий экземпляр компонента ?

Это можно сделать с помощью клички/moniker. Если вы хотите получить несколько ссылок на один экземпляр word, вы можете создать этот экземпляр так:

$word = new COM("C:\docs\word.doc");

На размышления не наводит?
21 Steban
 
15.09.06
15:16
+(20) Соединение можно создавать вне PHP-скрипта. а в скрипте - только получать готовое.
22 Ангел- Хоронитель
 
15.09.06
15:16
(19)а как делаются интернет-магазины? синхронизация с определенным интервалом?
23 ШтушаКутуша
 
15.09.06
15:18
(0) не получится с flush,даже можешь и не пробовать,а писать нужно
отдельную приблуду,сервер safe-state.
24 Camino
 
15.09.06
15:20
(20) Проверено. Не работает, ибо объекта больше нет.
(22) Как вариант - хранение в MySQL с периодической репликацией. Но у меня в каталоге, например, работает СОМ-коннектор к нашей торговой системе (не 1С): http://magnat-audio.ru/acoustics/section.php?qid=4543
25 AlexNV
 
15.09.06
15:29
Напиши прогу, которая будет держать сессию, и с ней работай. через сокеты например. я делал, работает супер
26 Steban
 
15.09.06
15:29
(24) ты не понял.
я предлагаю вместо
$app = new COM("V8.COMConnector"); написать что-то типа:
$app = new COM(""objref:blablablablabla");
где blablabla - это ObjRef-моникер, созданный вне PHP-скрипта. И приложение (или скрипт), создавший моникер будет удерживать на него ссылку.
http://rsdn.ru/?article/com/monikers.xml
27 Steban
 
15.09.06
15:31
теги перестали работать......
тема перенесена из LIFE?
28 Camino
 
15.09.06
15:32
(25,26) Вариант, конечно. Только надо еще этого моникера написать. На каком языке? Я, например, кроме 1С, РНР и VBA ничего не знаю...
(27) Перестали. Черт его знает, почему. Сейчас разберемся.
29 ШтушаКутуша
 
15.09.06
15:34
интересно как вы собираетесь задействовать не IDispatch интерфейсы в скрипте?
30 Steban
 
15.09.06
15:34
(29) V8.COMConnector реализует IDispatch. А что еще надо?
31 ШтушаКутуша
 
15.09.06
15:36
(30) но удержать указатель нужно же при помощи IMoniker?
Imoniker это чистый COM объект,то есть он не поддерживает IDispatch(OLE AUTO)
32 Steban
 
15.09.06
15:37
Недавно уже отвечал. Щас найду.
33 Steban
 
15.09.06
15:38
>Основной момент - можно ли (и как?) сохранять ссылку на COM-сервер между сеансами
это можно сделать при помощи ObjRef Moniker'а
про моникеры почитать можно тут: http://rsdn.ru/?article/com/monikers.xml
Создается моникер вызовом CreateObjRefMoniker из ole32.dll
Ссылка на COM-объект получается из моникера вызовом CoGetObject из ole32.dll
Взлетит ли связка ...?
34 Steban
 
15.09.06
15:40
+(33) "C:\docs\word.doc" из примера - это тоже моникер (файловый).
35 ШтушаКутуша
 
15.09.06
15:42
(33) уродливо как то,ненадежно,как ты думаешь,что может быть если
скрипт и/или веб-сервер упадут? Правильно,в памяти останется процесс.
Необходимо реализовать фичу,что бы она возвращала все в пул ресурсов
и могла поддерживать много соединений сделанных в произвольный момент времени.
36 Steban
 
15.09.06
15:45
Автор ветки спрашивает: как удержать связь?
Вариант решения предложен.
37 Steban
 
15.09.06
15:46
(35)А то, что для нормального веб-приложения надо организовать пулинг ресурсов, тут с тобой полностью согласен :)
38 ШтушаКутуша
 
15.09.06
15:48
короче,если фирма где работает автор готова проплатить,то пожа.
результат и надежность работы гарантирую. )
39 Steban
 
15.09.06
15:54
(38) предлагаешь готовое решение?
40 ШтушаКутуша
 
15.09.06
15:56
(39) вполне. сделано для 7.7 ,но переписать его для 8-ки,не составит большого труда. Просто необходимости не было-для 7.7 такой Application server
актуальнее.
41 Salvador Limones
 
20.09.06
16:13
В общем перевёл всё на IIS. Теперь другая проблема, как отключиться?
По окончании работы делаю:
dcl.NewConn = Nothing
dcl.RezConn = Nothing
System.GC.Collect()
Вот как здесь: http://www.gotdotnet.ru/Forums/Common/160330.aspx
Но соединение с базой остается.
42 Steban
 
20.09.06
17:18
а зачем нужно закрывать соединение?
наоборот, здорово, что оно сохраняется - при следующем выполнении скрипта Connect выполнится мгновенно.
Описание:
Метод Connect устанавливает COM-соединение с информационной базой 1С:Предприятия 8.0 и возвращает ссылку на объект COM-соединение.
Установка соединения выполняется по следующему алгоритму:

1. COM-соединение с требуемыми параметрами ищется в пуле соединений. Если найдено, то используется оно.

2. Если COM-соединение с требуемыми параметрами не найдено, то анализируется не исчерпан ли лимит по числу одновременно существующих соединений. Если не исчерпан, то создается новое COM-соединение.

3. Если лимит исчерпан, но при этом в пуле имеются неиспользуемые COM-соединения, то соединение, дольше всех находящееся в пуле, удаляется и создается новое COM-соединение.

4. Если никаким способом найти подходящее или создать новое COM-соединение не удалось, то происходит ожидание освобождения COM-соединения другим потоком, после чего весь процесс повторяется, начиная с пункта 1.

43 Ангел- Хоронитель
 
20.09.06
17:49
(41)unset не подойдет?
44 Steban
 
20.09.06
17:57
(43)дык речь уже не про PHP а про VB
45 Ангел- Хоронитель
 
20.09.06
18:01
(44)упс.... проморгал....