2010-11-11 9 views
5

Mam aplikację internetową PHP, która musi wywoływać funkcję w bibliotece C++. Ta biblioteka jest dostarczana przez dostawcę (libfoo.a na komputerze z systemem Linux).Wywołanie biblioteki C++ z aplikacji internetowej PHP: system() vs rozszerzenie SWIG PHP?

  1. Moim pierwszym odruchem jest stworzenie pliku wykonywalnego C++, która łączy przeciwko libfoo.a i przekazuje parametry wiersza polecenia do funkcji. Aplikacja internetowa PHP może następnie wykonać wywołanie system() do mojego pliku wykonywalnego C++. To byłoby łatwe do wdrożenia. Moją obawą jest to, czy spowodowałoby to dodatkowe obciążenie dla stworzenia nowego procesu systemowego dla każdego połączenia. Ile kosztowałoby to obciążenie?

  2. Alternatywą jest to, że mogę użyć SWIG do objęcia funkcji C++ w rozszerzeniu PHP, ale nie mam kodu źródłowego C++. Czy SWIG obsługuje łączenie z biblioteką ".a"? Czy wymagałoby to od każdego innego inżyniera z mojego zespołu, aby zmienili konfigurację PHP tak, aby tworzył bibliotekę libfoo.a?

Jeżeli narzut system() wywołanie jest mała (< 30 ms), wolałbym opcję nr 1, jak wydaje się o wiele prostsze do tworzenia C++ wykonywalny raz, a nie budować go w PHP podanie. Jakie są twoje zalecenia dotyczące dwóch opcji?

+0

Czy potrzebujesz danych wyjściowych z 'C++'? jeśli nie, możesz rozważyć wypchnięcie wywołania do tła - http://stackoverflow.com/questions/45953/php-execute-a-background-process – ajreal

+0

tylko zwykłą obserwację zewnętrzną, ale nie wiedząc, jak często będzie ona wywoływana, brzmi, jakbyś był lepszy od tworzenia pliku wykonywalnego C++ (który pozwoliłby na użycie poza PHP jako bonus). Jeśli zrobiłeś to w rozszerzeniu PHP, wyobrażam sobie, że nieuchronnie zmierzysz się z koszmarem dystrybucji i kompatybilności nawet dla małej, prywatnej bazy użytkowników. Czy próbowałeś lub odkryłeś coś, odkąd otworzyłeś to pytanie? –

Odpowiedz

0

Nie wiesz, co zrobiłeś, ale w końcu zrobiłem prosty php rozszerzenie otoki lat temu wywoływania C++ lib. W ten sposób nie będziesz mieć wpływu na wywołanie systemowe. Nie stanowi to dla ciebie problemu, ale będziesz mieć lepszą kontrolę nad połączeniami do biblioteki. Na przykład utrzymywanie załadowanego opakowania w pamięci w przeciwieństwie do ładowania go przy każdym wywołaniu, utrzymywanie niestandardowych parametrów konfiguracyjnych itd. Zależy od natury twojej biblioteki.

Zaledwie kilka odnośników, które mogą być interesujące:

0

Polecam opcję 2. Nie mam doświadczenia z PHP/SWIG, ale zrobiłem to samo dla perl, java i PLSQL (oracle). Kodujemy niektóre podstawowe funkcje w C/C++ (i używamy libraires innych firm), które następnie zawijamy w odpowiednie opakowanie.

Robimy to głównie, aby nie powielać podstawowej funkcjonalności w trzech językach aplikacji. Skuteczność użycia C jest dodatkową korzyścią. Używanie takiego wrappera jest (moim zdaniem) bezpieczniejsze niż "wyławianie" z systemu, ponieważ można przekazać odpowiednie parametry i zwrócić wartości jako zmienne przeciwne bałaganemu biznesowi parsowania standardowego wyjścia.

Główne punkty do zapamiętania:

  • Trzeba będzie korzystać z niektórych funkcji dostarczanych przez język aplikacji (PHP dla ciebie) przeznaczyć dowolną pamięć dla nowych danych. na przykład w perlu jego NewSV.
  • Zwykle jest jakiś config obowiązek powiedzieć PHP gdzie znaleźć skompilowany .so/.dll
1

I sugerowałoby użycie protokołu IPC (komunikacja między procesami).Jeśli masz zamiar napisać aplikacji C++ z wykorzystaniem biblioteki w każdym razie - napisać protokół komunikacyjny (za pomocą protokołu TCP/IP lub gniazda Unix) i uruchomić aplikację jako demon

zobaczyć man 3 daemon, man 2 fork i Unix sockets guide

PS: budowanie biblioteki na PHP nie jest dobrym pomysłem - C++ nie jest tak bezpieczny jak PHP. jeśli biblioteka lub moduł php ulegnie awarii - cały serwer się zawiesza lub w najlepszym wypadku proces jednego serwera ulega awarii. Jeśli je oddzielisz, a program/lib ulegnie awarii, możesz pokazać komunikat, że coś jest nie tak (lub nawet wysłać wiadomość e-mail z alertem), co nie może się zdarzyć, jeśli Twój serwer sieciowy jest wyłączony:

2

Pamiętaj, że C++ vs C produkuje odmienna nazwa funkcji, która powoduje, że różne nazwy funkcji DLL mają te same funkcje, co oznacza różne powiązania.

"Zewnętrzni dostawcy usług muszą przebudować swoje rozszerzenia, aby były kompatybilne i możliwe do załadowania dzięki wersjom Visual Studio C++ 9, które teraz dostarczamy."