Kapitola 51. PHP a COM

PHP lze na platformßch Win32 pou╛φt k p°φstupu k objekt∙m COM a DCOM.

1. Zkompiloval jsem knihovnu DLL k n∞jak²m v²poΦt∙m. Existuje zp∙sob, jak tuto knihovnu spustit pod PHP?
2. Co znamenß 'Unsupported variant type: xxxx (0xxxxx)'?
3. Je mo╛nΘ v PHP manipulovat vizußlnφmi objekty?
4. Mohu uklßdat COM objekty do session?
5. Jak mohu zachycovat chyby COM?
6. Mohu generovat knihovny DLL z PHP skript∙, podobn∞ jako v Perlu?
7. Co znamenß 'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'?
8. Jak lze spustit objekt COM ze vzdßlenΘho serveru?
9. Zobrazilo se 'DCOM is disabled in C:\path...\scriptname.php on line 6', co mßm d∞lat?
10. Lze naΦφst objekt ActiveX na strßnce, resp. s nφm manipulovat, pomocφ PHP?
11. Je mo╛nΘ zφskat b∞╛φcφ instanci komponenty?
12. Existuje zp∙sob, jak obslou╛it udßlost odeslanou z objektu COM?
13. Mßm problΘmy, kdy╛ se pokou╣φm vyvolat metodu objektu COM, kterß vystavuje vφce ne╛ jeden interface. Co mßm d∞lat?
14. Kdy╛ PHP pracuje s COM, jak je to s COM+?
15. Jestli╛e m∙╛e PHP manipulovat s objekty COM, lze si p°edstavit pou╛itφ MTS ke sprßv∞ prost°edk∙ komponent spoleΦn∞ s PHP?

1. Zkompiloval jsem knihovnu DLL k n∞jak²m v²poΦt∙m. Existuje zp∙sob, jak tuto knihovnu spustit pod PHP?

Pokud je to jednoduchß DLL knihovna, zatφm ji nenφ mo╛nΘ spustit z PHP. Pokud v╣ak tato knihovna obsahuje COM server, m∙╛ete k nφ p°istupovat, pokud implementuje interface IDispatch.

2. Co znamenß 'Unsupported variant type: xxxx (0xxxxx)'?

Existujφ tucty typ∙ VARIANT a jejich kombinacφ. V∞t╣ina z nich je ji╛ podporovßna, ale n∞kolik z nich teprve musφ b²t implementovßno. Pole nejsou podporovßna pln∞. Mezi PHP a COM lze vym∞≥ovat pouze jednorozm∞rnß indexovanß pole. Pokud najdete jinΘ typy, kterΘ nejsou podporovßny, ohla╣te je prosφm jako chybu - bug (pokud ji╛ nebyly ohlß╣eny) a poskytn∞te o nich tolik informacφ, kolik m∙╛ete.

3. Je mo╛nΘ v PHP manipulovat vizußlnφmi objekty?

Obecn∞ je, ale proto╛e PHP se nejΦast∞ji pou╛φvß jako webovsk² skriptovacφ jazyk, b∞╛φ v prost°edφ WWW serveru, a proto se vizußlnφ objekty nezobrazujφ na plo╣e displeje serveru. Pokud pou╛φvßte PHP pro aplikaΦnφ skriptovßnφ, nap°. spoleΦn∞ s PHP-GTK, neexistuje omezenφ p°φstupu a manipulace s vizußlnφmi objekty pomocφ COM.

4. Mohu uklßdat COM objekty do session?

Nem∙╛ete. S instancemi COM se naklßdß jako s prost°edky a proto jsou k dispozici pouze v kontextu jedinΘho skriptu.

5. Jak mohu zachycovat chyby COM?

Momentßln∞ nenφ mo╛nΘ zachycovat chyby COM krom∞ zp∙sob∙ poskytovan²ch samotn²m PHP (@, track_errors, ...), nicmΘn∞ p°em²╣lφme o zp∙sobu, jak to implementovat.

6. Mohu generovat knihovny DLL z PHP skript∙, podobn∞ jako v Perlu?

Ne, v PHP bohu╛el nenφ takov² nßstroj k dispozici.

7. Co znamenß 'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'?

Tato chyba m∙╛e mφt vφce p°φΦin:

  • hodnota CLSID je chybnß

  • chybφ po╛adovanß DLL knihovna

  • po╛adovanß komponenta neimplementuje interface IDispatch

8. Jak lze spustit objekt COM ze vzdßlenΘho serveru?

P°esn∞ tak, jak spou╣tφte mφstnφ objekty. Musφte pouze pou╛φt IP adresu vzdßlenΘho stroje jako druh² parametr konstruktoru COM.

Ujist∞te se, ╛e je nastaveno com.allow_dcom=true v souboru php.ini.

9. Zobrazilo se 'DCOM is disabled in C:\path...\scriptname.php on line 6', co mßm d∞lat?

Upravte soubor php.ini - nastavte tam com.allow_dcom=true.

10. Lze naΦφst objekt ActiveX na strßnce, resp. s nφm manipulovat, pomocφ PHP?

To nemß s PHP nic spoleΦnΘho. Objekty ActiveX se naΦφtajφ na stran∞ klienta, pokud jsou vy╛ßdßny HTML dokumentem. Nemß to ╛ßdnou souvislost s PHP skriptem a proto nenφ mo╛nß ╛ßdnß p°φmß interakce na stran∞ serveru.

11. Je mo╛nΘ zφskat b∞╛φcφ instanci komponenty?

Je to mo╛nΘ pomocφ "moniker∙". Pokud chcete zφskat vφce referencφ na tutΘ╛ instanci, m∙╛ete vytvo°it tuto instanci tφmto zp∙sobem:

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

Toto vytvo°φ novou instanci, pokud nenφ k dispozici ╛ßdnß b∞╛φcφ instance, resp. vrßtφ handle na b∞╛φcφ instanci.

12. Existuje zp∙sob, jak obslou╛it udßlost odeslanou z objektu COM?

Zatφm ne.

13. Mßm problΘmy, kdy╛ se pokou╣φm vyvolat metodu objektu COM, kterß vystavuje vφce ne╛ jeden interface. Co mßm d∞lat?

Odpov∞∩ je stejn∞ tak jednoduchß, jako neuspokojivß. Nelze to °φci p°esn∞, ale asi nem∙╛ete d∞lat nic. Pokud mß n∞kdo specifickΘ informace o tomto problΘmu, a╗ laskav∞ napφ╣e sem.

14. Kdy╛ PHP pracuje s COM, jak je to s COM+?

COM+ roz╣i°uje COM rßmec pro sprßvu komponent p°es MTS a MSMQ, ale nenφ to nic zvlß╣tnφho na to, aby PHP muselo takovΘ komponenty podporovat.

15. Jestli╛e m∙╛e PHP manipulovat s objekty COM, lze si p°edstavit pou╛itφ MTS ke sprßv∞ prost°edk∙ komponent spoleΦn∞ s PHP?

PHP samotnΘ nem∙╛e zatφm obsluhovat transakce. Proto kdy╛ nastane chyba, nenφ iniciovßn ╛ßdn² rollback. Pokud pou╛φvßte komponenty, kterΘ podporujφ transakce, budete muset implementovat vlastnφ mechanismus sprßvy transakcφ.