この記事では主に、Linux と Windows での C 拡張子 .so ファイルのパッケージ化の違いについて説明します。詳細なコードと構成計画については、別のブログを参照してください: http://blog.csdn.net/maverick1990/article/details /46519045
手順:
1. PHP 環境をディレクトリ /usr/local/php/
にインストールします。2. 同じバージョンの PHP ソース コード パッケージをダウンロードし、/root/php-5.6.9/ ディレクトリにインストールします。公式 Web サイトからダウンロードできます http://www.php.net/downloads.php
次のコマンドを実行します:
cd /root wget http://us1.php.net/distributions/php-5.6.9.tar.bz2 tar -xf php-5.6.9.tar.bz2
3. /php-5.6.9/ext/ ディレクトリに移動し、ext_skel を使用して拡張スケルトンを生成します
cd ./php-5.6.9/ext ./ext_skel --extname=test
次の 2 行の dnl コメントをキャンセルします。
PHP_ARG_ENABLE(test, whether to enable test support, dnl Make sure that the comment is aligned: [ --enable-test Enable test support])
PHP_REQUIRE_CXX() PHP_ADD_LIBRARY(stdc++, 1, EXTRA_LDFLAGS) PHP_NEW_EXTENSION(test, test.cpp, $ext_shared)
PHP_MINIT_FUNCTION(test); PHP_MSHUTDOWN_FUNCTION(test); PHP_RINIT_FUNCTION(test); PHP_RSHUTDOWN_FUNCTION(test); PHP_MINFO_FUNCTION(test); PHP_FUNCTION(confirm_test_compiled); /* For testing, remove later. */ PHP_FUNCTION(testFunc);
(1) まず、この場所で使用されるヘッダー ファイルを導入します:
#ifdef HAVE_CONFIG_H #include "config.h" #endif #include <stdio.h> #include <string.h> #include <math.h>
#include "php.h" #include "php_ini.h" #include "ext/standard/info.h" #include "php_test.h"
(2) 次に、次の場所に関数エントリを追加します。
const zend_function_entry test_functions[] = { PHP_FE(confirm_test_compiled, NULL) /* For testing, remove later. */ PHP_FE(testFunc, NULL) PHP_FE_END /* Must be the last line in test_functions[] */ };
PHP_FUNCTION(testFunc) { char *x = NULL; char *y = NULL; int argc = ZEND_NUM_ARGS(); int x_len; int y_len; if (zend_parse_parameters(argc TSRMLS_CC, "ss", &x, &x_len, &y, &y_len) == FAILURE) return; int result_length = x_len + y_len; char* result = (char *) emalloc(result_length + 1); strcpy(result, x); strcat(result, y); RETURN_STRINGL(result, result_length, 0); }
PHP_FUNCTION 関数の記述方法の詳細については、ブログ http://weizhifeng.net/write-php-extension-part2-1.html
7 を参照してください。 9/ext/ test/ ディレクトリに、php 拡張モジュールを作成します:
phpize
/usr/local/php/bin/phpize
8. /root/php-5.6.9/ ディレクトリに戻り、コンパイルに必要な設定を再確立します:
cd ../.. ./buildconf --force
同様のエラーが発生した場合:
buildconf: You need autoconf 2.59 or lower to build this version of PHP. You are currently trying to use 2.63 Most distros have separate autoconf 2.13 or 2.59 packages. On Debian/Ubuntu both autoconf2.13 and autoconf2.59 packages exist. Install autoconf2.13 and set the PHP_AUTOCONF env var to autoconf2.13 and try again.
yum install autoconf213 export PHP_AUTOC/bin/autoconf-2.13
./configure --with-php-c/local/php/bin/php-config
make install でエラーが発生した場合は、変更後に、現在生成されている拡張モジュールをクリアする必要があります:
make make install
11. test.so が生成されたかどうかを確認します
make install が成功すると、生成パスが指定されます (例: /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226)。 /test.so
12. php.ini を変更します
/usr/local/php/etc/php.ini ファイルを変更し、拡張子のパスと名前を追加します:
phpize --clean
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/" extension = "teste.so"
14 . PHP で C++ 拡張関数を使用する
service php-fpm restart
<?php $concat_str = testFunc("concat1","concat2"); echo $concat_str; ?>
著作権ステートメント。 : この記事はブロガーによるオリジナル記事です。ブロガーの許可なく転載を禁じます。
上記は、Linux 上で C を使用して PHP を拡張する方法 (so にパッケージ化されている) を、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。