![]() |
![]() |
![]() |
|
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. Можно ли получить работающий экземпляр компонента ? На размышления не наводит? |
|||
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 выполнится мгновенно. Описание: |
|||
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)упс.... проморгал....
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |