COM: PHP виснет, а JScript (ActiveX) работает

-SkyNet-

Новичок
COM: PHP виснет, а JScript (ActiveX) работает

Приветствую, уважаемые!

имеется задача.
по средствам СОМ считать данные из складской программы (sls-склад) через их модуль ActiveSklad ("сервер ole-автоматизации, предоставляющий пользователю набор интерфейсов, предназначенных для работы с базами данных системы SLS-Склад.")

версия php - 4.4
Apache/1.3.12

сам модуль ASklad зарегистрировал утилитой regsvr32
(ось Win XP SP1)
в dcomcnfg соответствующие полномочия доступа выставлены, localhost объявлен надежным узлом

что делаю:
PHP:
$AxLoader=new COM("SlsSklad.AxLoader");
// создали "основной объект пакета ActiveСклад"
echo $AxLoader->GetVersion;
//напечатали версию (проверили что свойства вызываются)
//теперь вызываем метод - подключаемся к БД
$AxLoader->OpenDatabase("//Server/SLS-Sklad/Links/TEST.DBY");
здесь php виснет, в диспетчере задач php съедает полнагрузки проца и 7Мб памяти
и ничего не происходит...

вариант 2:
PHP:
<html>
<body>
<script language="JavaScript"> 
function loadActiveX(){ 
var aaa="";
var aX = new ActiveXObject('SlsSklad.AxLoader'); 

aaa+="1 "+aX.ErrDescr+"\n";//ErrDescr - свойство, возвращающее расшифровку ошибки

aX.UseException=0;//потому что исключения не обрабатываем

aX.OpenDatabase("//Server/SLS-Sklad/Links/TEST.DBY");
//здесь всплывает SLS'овское окошко о подключении к базе...

aaa+="2 "+aX.ErrDescr+"\n";
AxSklad = aX.AxSklad();//создается объект для работы с БД
aaa+="3 "+aX.ErrDescr+"\n";
aaa+="4 "+AxSklad.ErrDescr+"\n";
AxSklad.Login("admin", "skynet", "192.168.1.109");//аутентиф.
aaa+="5 "+aX.ErrDescr+"\n";

alert(aaa);//выводится пустой пронумерованный список ошибок
AxSklad=0;//убиваем
aX=0;//объекты
}
</script><body> 
<input type=button onclick=loadActiveX() value=test>
</body></html>
з.ы. еще пробовал через макрос в excel - тож работает нормально...

вопрос мой очевиден:
как же так - почему PHP подвисает???
в принципе, на JS можно попечатать, но как-то это "через одно место" и , по-моему, несколько несерьезно :) хотя можно
короче, хочу чтоб работал любимый php!

жду помощи...

-~{}~ 05.12.05 20:38:

апдейт

я тут подумал
может, нужно работать не с самими интерфейсами, а со ссылками на них?

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

может, можно получить именно указатель на объект, если php4 передает объекты "по значению" записями типа $a->b()

запутался.

тем временем написано 100 строчек рабочего кода на JS...
 

Stm

Новичок
собственно проблема в том что твой COM компонент, не может использоваться (или ты его не правильно используешь для такого случая) из под службы(апач), как вариант компонент не может вывести окно:

aX.OpenDatabase("//Server/SLS-Sklad/Links/TEST.DBY");
//здесь всплывает SLS'овское окошко о подключении к базе...

потому что у службы может не быть десктопа, и что в таком случае делает твой компонент неизвестно.

Еще, то что, ты сравниваешь выполнение js и php наталкивает на подозрение что ты не понимаешь разницы http://phpfaq.ru/na_tanke
 

-SkyNet-

Новичок
моя ошибка
должен был пояснить более развернуто

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

короче, мощнейший набор разнообразнейших баз данных и возможностей.
для складской программы есть пакет "оле-автоматизации".
регистрируешь его на клиенте, и он помогает по средствам СОМ общаться со всеми этими базами.
соответственно, пакет предстает в виде масштабной объектной модели.

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

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

все дочерние интерфейсы также имеют набор рабочих свойств и также служат для создания других интерфейсов для своего круга задач.

в общем, к чему я веду.
"SLS'овское" окошко, сообщающее "подождите, идет подключение к базе" выводится когда пользуешься sls'овским клиентом, когда запускаешь макрос в Экселе, когда выполняется подключение через ActiveX-объект.

короче, этому пакету ole-автоматизации глубоко наплевать, какой мелодией играет звонок в дверь...

соответственно,
PHP:
aX.OpenDatabase("//Server/SLS-Sklad/Links/TEST.DBY"); 

// (синтаксис JS), равно как и

AxLoader->OpenDatabase("//Server/SLS-Sklad/Links/TEST.DBY");
- одно и то же!
вызов метода объекта AxLoader (aX) - с единственным параметром - путем до файла базы данных...

так где же разница???

-~{}~ 06.12.05 00:57:

капельку огорчительно получать в виде "совета" ссылку на основы основ... хотя, даж забавно! спустя 3-4 года после _начала

хех...) это конечно проще всего - зачем разбираться в вопросе? отправить чела читать про то, что такое клиент-сервер

а если вдумаццо?;)

я же не заставляю никого написать "что-то"/"что-нибудь". если кто-то реально может помочь - милости просим, с меня, как грится, пиффко :)

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

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

Profic

just Profic (PHP5 BetaTeam)
Я бы попробовать помучить php5, т.к. там, если ничего не поутаю, расширение com переписывалось почти с нуля.
 

Stm

Новичок
у меня расширение com прекрасно работало и в php4.

я не работал с таким обектом, так что дальше только мои домыслы.

если ты создаешь объект из js _на клиенте_ создается прокси объект который по rpc дергает методы sls серверного объекта выводя при это на клиенте всякие окошки о подключении к базе, при этом он работает под _клинеским_аккаунтом_. если ты создаешь объект из php _на_http_сервере_ создается прокси объект который по rpc дергает методы sls серверного объекта
(если и http и sls сервера на одной машине то прокси объект не создается а напрямую дергаются методы sls серверного объекта) и работает он под _аккаунтом_http_сервера_ да еще и вызывается из под службы, по моему очень большая разница в том кто создает пользовательский объект.

для проверки можно попробовать запустить на клиенте php скрипт из коммандной строки.
 

-SkyNet-

Новичок
дело говоришь

но http сервер стоит как раз на клиенте (на моем компе).
а sls-сервер соответственно на сервере

в самом верху в коде пхп я указал, что свойство (GetVersion) объекта AxLoader выводится (на экран)...
а вызов метода OpenDatabase приводит ни к чему,- к таймауту.
 

Stm

Новичок
ну и что что http стоит на твоем компе, аккаунты то разные у апача и у броузера + десктопа у апача нету, попробуй из cmd php скрипт запусти
 

-SkyNet-

Новичок
нда, в обход апача работает полностью...

по ходу, из-за отсутствия десктопа у последнего

наверна, если отключить это всплывающее оконце, скорее всё попёрло бы :))

-~{}~ 06.12.05 18:33:

Stm, респект и низкий поклон :))
 

slach

Новичок
1) com.allow_dcom = true в php.ini
2) разрешить службе apache работать с Desktop
3) ВЫКЛЮЧИТЬ нафик Zend Optimizer если есть
 

Stm

Новичок
4) запустить апач под аккаунтом который будет иметь права коннектится к серверу sls (не localsystem)
 

-SkyNet-

Новичок
че-то никак не могу найти где разрешение это ставить ( п.2) )

:(
 

Stm

Новичок
mmc %windir%\system32\services.msc

закладка Log On на службе appache, Allow service to interact with desktop, но её можно зачекать только для local system, попробуй может п. 4 необезательный.

да необезательный можно задать при создании объекта
из док. http://php.rinet.ru/manual/en/class.com.php :

If server_name is an array, it should contain the following elements (case sensitive!). Note that they are all optional (although you need to specify both Username and Password together); if you omit the Server setting, the default server will be used (as mentioned above), and the instantiation of the object will not be affected by the com.allow_dcom directive.
 

-SkyNet-

Новичок
Отцы! =))

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

Stm, опять же респект огромный!

З.Ы.: но данную задачу, все-таки, реализую на жабескрипт. пхпе оставил участь генерить выходные dbf'ки :)

-~{}~ 30.12.05 22:48:

Stm

проблема решается совсем просто
есть несколько полезных софтин, которые со службами могут творить воще что угодно
например, ФайрДаймон
можно даже службы из не_служб создавать%)
не говоря уже о том, чтобы выпустить апач под аккаунтом компа со способностью вываливать на десктоп что там его апачёвой душе угодно %)

так что.... даешь софтин, хороших и разных
еще бы вовремя!!! х))))


а так, всех с наступащими, великими и ужасными праздниками,
с пожеланием остроумных решений и хороших проектов!=)

аминь
 
Сверху