14

パフォーマンスを向上させるために C++ に移植したい、PHP で書かれたパフォーマンス集約型のルーチンがあります。C++ を使用してプラグインや拡張機能などを記述し、PHP からそれとやり取りする方法はありますか? 実際の PHP ソースを手動で編集せずに?

4

3 に答える 3

20

Remus が言うように、Zend API を使用して C/C++ で PHP を拡張できます。Sara Golemonによるリンクされたチュートリアルは良い出発点であり、同じ著者による本「PHP の拡張と埋め込み」では、この主題についてより詳細に説明しています。

ただし、これらの両方 (および私がオンラインで見つけたほとんどすべてのもの) は C に焦点を当てており、C++ 拡張機能を機能させるために必要ないくつかの調整については実際にはカバーしていないことに注意してください。

このconfig.m4ファイルでは、C++ 標準ライブラリに明示的にリンクする必要があります。

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

ファイル内のすべての C++ ライブラリ コンパイル チェックでconfig.m4も、C++ ライブラリをリンクする必要があります。

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

編集-g ++を指定する方法は次のとおりです。

最後に、拡張機能をビルドするときに C コンパイラ/リンカーではなく C++ を選択するには、 への6 番目のパラメーターPHP_NEW_EXTENSION()"yes". すなわち:

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

PHP ビルド システム マニュアルから、パラメーターは次のとおりです。

  1. 拡張機能の名前
  2. 拡張機能の一部であるすべてのソース ファイルのリスト。
  3. (オプション) $ext_sharedPHP_ARG_WITH() が呼び出されたときに configure によって決定された値
  4. (オプション) 「SAPI クラス」。特に CGI または CLI SAPI を必要とする拡張機能にのみ役立ちます。それ以外の場合はすべて空のままにする必要があります。
  5. (オプション) 拡張機能のビルド中に CFLAGS に追加されるフラグのリスト。
  6. (オプション) "yes" の場合、$CC の代わりに $CXX を使用して拡張機能全体を強制的に構築するブール値。

gcc の代わりに g++ をコンパイラ/リンカーとして設定するように構成スクリプトを取得する方法を理解できなかったため、sed コマンドを使用して Makefile をハッキングし、bash ビルド スクリプトで検索置換を実行することになりました。

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

おそらく、このハックを不要にする automakeコマンドがあるでしょう。

于 2009-12-27T16:33:59.497 に答える
2

PHP 自体は、緩やかに関連するライブラリのコレクションです。独自の作成方法のチュートリアルについては、http://devzone.zend.com/article/1021を参照してください。

于 2009-07-10T17:06:11.273 に答える