C++ で PHP を拡張しますか?
-
12-09-2019 - |
質問
PHP で書かれたパフォーマンス重視のルーチンがあり、パフォーマンス向上のために C++ に移植したいと考えています。C++を使用してプラグインや拡張機能などを作成し、PHPからそれとインターフェースする方法はありますか?実際の PHP ソースを手動で編集せずに?
解決
私は次の助けを借りて C++ で PHP プラグインを作成しました。 スイグ. 。実行可能ですが、SWIG コンパイル サイクルに慣れるまでに時間がかかるかもしれません。から始めることができます PHP の SWIG ドキュメント.
アップデート
@therefromhere が述べているように、この本を入手することを強くお勧めします。 PHP の拡張と埋め込み. 。オンラインで見つかるドキュメントはほとんどありません (少なくとも、私が PHP プラグインを作成した 2008 年末から 2009 年の初めにはドキュメントはありませんでした)。私はすべてを本に頼らなければなりませんでした。ただし、サンプル コードを見つけるのに Google コード検索が役立つ場合もあります。
他のヒント
として リーマスは言う, 、Zend API を使用して PHP を C/C++ で拡張できます。リンクされたチュートリアル サラ・ゴーレモン 良いスタートであり、この本は 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ビルドシステムマニュアル, 、パラメータは次のとおりです。
- 拡張機能の名前
- 拡張機能の一部であるすべてのソース ファイルのリスト。
- (オプション)
$ext_shared
, 、 PHP_ARG_WITH() が呼び出されたときにconfigureによって決定された値 - (オプション) 「SAPI クラス」。特に CGI または CLI SAPI を必要とする拡張機能にのみ役立ちます。それ以外の場合はすべて空のままにしておく必要があります。
- (オプション) 拡張機能の構築中に CFLAGS に追加されるフラグのリスト。
- (オプション) ブール値。「yes」の場合、$CC の代わりに $CXX を使用して拡張機能全体が強制的に構築されます。
gcc の代わりに g++ をコンパイラー/リンカーとして設定するためのconfigure スクリプトを取得する方法が見つからなかったので、最終的に 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
おそらく、 オートメイク このハックを不要にするコマンド。
PHP自体緩く関連のライブラリのコレクション。書く方法チュートリアルの http://devzone.zend.com/article/1021するを参照してください。あなた自身ます。