ある関数が so ファイルにコンパイルされているのですが、php から呼び出すにはどうすればよいでしょうか? 1 つの方法は、php モジュール (php 拡張子) を作成し、php でモジュール内の関数を呼び出し、そのモジュールを使用して so 内の関数を呼び出すことです。ここでは、オペレーティング システムとして Fedora Core 6 を使用した簡単な例を示します。
まず、単純な so ファイルを作成します。
/**
* こんにちは。c
* コンパイルするには、次のコマンドを使用します:
* gcc -O -c -fPIC -o hello.o hello.c
* gcc -shared -o libhello.so hello.o
*/
int hello_add(int a, int b)
{
return a + b;
}
次に、それを .so ファイルにコンパイルし、システムに配置します。
$ gcc -O -c -fPIC -o hello.o hello.c
$ gcc -shared -o libhello.so hello.o
$su
# echo /usr/local/lib > /etc/ld.so.conf.d/local.conf
# cp libhello.so /usr/local/lib
# /sbin/ldconfig 正しいことを検証するための小さなプログラムを作成します。
/**
* hellotest.c
* コンパイルするには、次のコマンドを使用します:
* gcc -o hellotest -lhello hellotest.c
*/
#include
int main()
{
int a = 3、b = 4;
printf("%d + %d = %dn", a, b, hello_add(a,b));
return 0;
}
コンパイルして実行します:
$ gcc -o hellotest -lhello hellotest.c
$ ./hellotest
3 + 4 = 7OK、
次にPHPモジュールを作成します。まず、php-devel パッケージがインストールされていることを確認してください。インストールされていない場合は、インストール CD から見つけてください。次に、phpのソースコードをダウンロードします。私はphp-5.2.9.tar.gzを解凍して使用しています。
$ tar xzvf php-5.2.9.tar.gz
$ cd php-5.2.9/ext を実行し、次のコマンドを使用して test という名前のモジュールを作成します。
$ ./ext_skel --extname=test このコマンドを実行すると、モジュールをコンパイルするためにどのコマンドを使用する必要があるかを尋ねられます。残念ながら、これはモジュールを PHP に統合するコンパイル方法です。これを動的にロード可能な php_test.so にコンパイルする場合、方法はより簡単です。
$ cd test まず、config.m4 ファイルを編集し、16 行目と 18 行目のコメントを削除します (コメント記号は dnl です)。
16: PHP_ARG_ENABLE(テスト、テストサポートを有効にするかどうか、
17: dnl コメントが整列していることを確認してください:
18: [ --enable-test テスト サポートを有効にする]) 次に、phpize () プログラムを実行して構成スクリプトを生成します。
$ phpize してから php_test.h を開き、PHP_FUNCTION(confirm_test_compiled); の下に関数宣言を追加します。
PHP_FUNCTION(confirm_hello_compiled); /* テストのため、後で削除します。
PHP_FUNCTION(test_add); hello.c を開き、PHP_FE(confirm_test_compiled, NULL) の下に次の内容を追加します。
zend_function_entry test_functions[] = {
PHP_FE(confirm_test_compiled, NULL) /* テストのため、後で削除します */
PHP_FE(test_add, NULL) /* テストのため、後で削除します */
{NULL, NULL, NULL} /* test_functions[] の最後の行である必要があります */
};
PHP_FUNCTION(test_add)
{
long int a, b;
long int の結果;
If (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a, &b) == FAILURE) {
return;
}
結果 = test_add(a, b);
RETURN_LONG(結果);
}
保存して終了し、コンパイルしてインストールします:
$ ./configure --enable-jinzhesheng_module --with-apxs=/usr/local/apache/bin/apxs --with-php-config=/usr/local/php/bin/php-config$ make
# cp modules/test.so /usr/lib/php/modules 次に、次の内容を含む test.php ファイルを /www/web/ に作成します。
dl("test.so");
echo test_add(1, 2);
?>
次に、ブラウザで test.php ファイルを開き、3 が表示されれば関数呼び出しは成功です。