C + + ile PHP genişletme?

3 Cevap php

Ben bir performans artışı için C + + port istiyorum PHP ile yazılmış bir performans yoğun bir rutin var. PHP onunla C + + ve arabirimini kullanarak bir eklenti veya uzatma ya da bir şey yazmak için herhangi bir yolu var mı? Elle gerçek PHP kaynak düzenleme OLMADAN?

3 Cevap

I SWIG yardımı ile C + + 'da bir PHP eklentisi yazdım. Bu yapılabilir, ama yudum-derleme döngüsü alışmak için bir süre alabilir. Sen SWIG docs for PHP ile başlayabilirsiniz.

Update
As @therefromhere has mentioned, I greatly recommend that you get the book Extending and Embedding PHP. There is almost no documentation to be found online (at least there wasn't in late 2008, early 2009 when I did my PHP plugin). I had to rely on the book for everything. Although sometimes Google Code Search is helpful for finding sample code.

Remus says, sen Zend API kullanarak C / C + + PHP uzatmak gibi. Tarafından bağlanmış öğretici Sara Golemon iyi bir başlangıç ​​olduğunu ve aynı yazar tarafından kitap Extending and Embedding PHP çok daha ayrıntılı olarak konuyu kapsar.

Ancak, bu iki (ve hemen hemen çevrimiçi bulundu herşey) C ve odak gerçekten çalışan C + + uzantıları almak için gereken bazı tweaks örtmeyen fazlalaştı.

config.m4 dosya içinde açıkça C + + standart kütüphane bağlantı gerekir:

PHP_REQUIRE_CXX()
PHP_ADD_LIBRARY(stdc++, 1, PHP5CPP_SHARED_LIBADD)

Herhangi bir C + + kütüphane de C + + lib bağlayan gerektirecektir config.m4 dosyasındaki kontrolleri derleme:

PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,,
[
  AC_MSG_ERROR([lib $LIBNAME not found.])
],[
  -lstdc++ -ldl
])

EDIT - and here's how to specify g++:

Son ve en az değil, uzantısı oluştururken C + + yerine C daha derleyici / bağlayıcı seçmek için, PHP_NEW_EXTENSION() olmalıdır için 6th parametresi "yes". yani:

PHP_NEW_EXTENSION(your_extension,
                  your_extension.cpp, 
                  $ext_shared, 
                  ,
                  "-Wall -Werror -Wno-error=write-strings -Wno-sign-compare",
                  "yes")

PHP build system manual kaynaktan, parametreler şunlardır:

  1. Uzatma ismi
  2. Uzatma parçası olan tüm kaynak dosyaları listesi.
  3. PHP_ARG_WITH () için çağrıldığında configure tarafından tespit edilmiştir (isteğe bağlı) $ext_shared, bir değer
  4. (Isteğe bağlı) "SAPI sınıf", CGI veya CLI SAPI'lerinin özellikle gerektiren uzantıları için yararlıdır. Tüm diğer durumlarda boş bırakılmalıdır.
  5. Uzantısı inşa ederken CFLAGS eklenecek bayrakların (isteğe bağlı) bir listesi.
  6. (Isteğe bağlı) Bir mantıksal değer olan, "evet", $ Cxx yerine $ CC kullanılarak inşa edilecek tüm uzantıyı zorlar eğer.

I couldn't work out how to get the configure script to set g++ as the compiler/linker instead of gcc, so ended up hacking the Makefile with a sed command to do a search replace in my bash build script:

phpize
./configure --with-myextension
if [ "$?" == 0 ]; then
# Ugly hack to force use of g++ instead of gcc
# (otherwise we'll get linking errors at runtime)
   sed -i 's/gcc/g++/g' Makefile
   make clean
   make
fi

Presumably there's an automake command that would make this hack unnecessary.

PHP kendisi gevşek ilgili kitaplık bir koleksiyon. Kendi yazmak için nasıl bir öğretici için http://devzone.zend.com/article/1021 bakın.