ホームページ  >  記事  >  バックエンド開発  >  php を使用して so ライブラリ ファイル内のコードを呼び出します

php を使用して so ライブラリ ファイル内のコードを呼び出します

不言
不言オリジナル
2018-04-09 10:04:157331ブラウズ

この記事の内容は、PHP を使用してライブラリ ファイル内のコードを呼び出すことです。必要な友人はそれを参照できます

ある関数がsoファイルにコンパイルされているのですが、phpから呼び出すにはどうすればよいでしょうか? 1 つの方法は、PHP モジュール (PHP 拡張機能) を 記述し、PHP でモジュール 内の関数を呼び出し、、そのモジュールを使用してその関数を呼び出す という方法です。ここでは、オペレーティング システムとして Fedora Core 6 を使用した簡単な例を示します。

まず単純な so ファイルを作成します:

1  /**
 2   * hello.c
 3   * To compile, use following commands:
 4   *   gcc -O -c -fPIC -o hello.o hello.c 
 5   *   gcc -shared -o libhello.so hello.o
 6   */
 7  
 8  int hello_add(int a, int b)
 9  {
10      return a + b;
11  }

次にそれを .so ファイルにコンパイルしてシステムに置きます:

1 ___FCKpd___1nbsp;gcc -O -c -fPIC -o hello.o hello.c
2 ___FCKpd___1nbsp;gcc -shared -o libhello.so hello.o
3 ___FCKpd___1nbsp;su
4 # echo /usr/local/lib > /etc/ld.so.conf.d/local.conf
5 # cp libhello.so /usr/local/lib
6 # /sbin/ldconfig

正しいことを検証するための小さなプログラムを作成します:

 1/**
 2  * hellotest.c
 3  * To compile, use following commands:
 4  *   gcc -o hellotest -lhello hellotest.c
 5  */
 6 #include <stdio.h>
 7 int main()
 8 {
 9     int a = 3, b = 4;
10     printf("%d + %d = %d/n", a, b, hello_add(a,b));
11     return 0;
12 }

コンパイルして実行します:

 $ gcc -o hellotest -lhello hellotest.c
$ ./hellotest
3 + 4 = 7

OK、PHP モジュールを作成しましょう。まず、php-devel パッケージがインストールされていることを確認してください。インストールされていない場合は、インストール CD から見つけてください。次に、phpのソースコードをダウンロードします。私はphp-5.2.3.tar.gzを解凍して使用しています。

 $ tar xzvf php-5.2.3.tar.gz
$ cd php-5.2.3/ext

次に、次のコマンドを使用して hello という名前のモジュールを作成します。

 $ ./ext_skel --extname=hello

このコマンドを実行すると、モジュールをコンパイルするためにどのコマンドを使用するかを尋ねられます。残念ながら、これはモジュールを PHP に統合するコンパイル方法です。これを動的にロード可能な php_hello.so にコンパイルする場合、方法はより簡単です。

 $ cd hello

まず config.m4 ファイルを編集し、16 行目と 18 行目のコメントを削除します (コメント記号は dnl です)。

1 16:  PHP_ARG_ENABLE(hello, whether to enable hello support,
2 17:  dnl Make sure that the comment is aligned:
3 18:  [  --enable-hello           Enable hello support])

次に phpize プログラムを実行して、configure スクリプトを生成します:

 $ phpize

次に、php_hello.h を開きます。 in PHP_FUNCTION (confirm_hello_compiled); 以下に関数宣言を追加します:

1PHP_FUNCTION(confirm_hello_compiled);   /* For testing, remove later. */
2 PHP_FUNCTION(hello_add);

hello.c を開き、PHP_FE(confirm_hello_compiled, NULL) の下に次の内容を追加します。

<br/>

次に、hello.c の最後に hello_add 関数の内容を書き込みます:

 1PHP_FUNCTION(hello_add)
 2 {
 3     long int a, b;
 4     long int result;
 5 
 6     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a, &b) == FAILURE) {
 7         return;
 8     }
 9 
10     result = hello_add(a, b);
11 
12     RETURN_LONG(result);
13 }

保存して終了し、コンパイルしてインストールします:

___FCKpd___12nbsp;./configure
 ___FCKpd___12nbsp;make LDFLAGS=-lhello
 ___FCKpd___12nbsp;su
 # cp modules/hello.so /usr/lib/php/modules

次に、次の内容を含む hello.php ファイルを /var/www/html の下に作成します。 :

 <?php
dl("hello.so");
echo hello_add(3, 4);
?>

次に、hello.php ファイルをブラウザで開きます。7 が表示されれば、関数呼び出しは成功です。

Linux 知識の補足:

Editplus を使用しているため、デフォルトの C 言語ソース プログラムは .cpp として保存され、それを cygwin の下で gcc でコンパイルします。その結果、一部の関数は常に宣言されていないように見えますが、これらの関数はすべて宣言されていません。標準システムに電話してください。なぜですか?


私は昼も夜もこの問題で憂鬱でしたが、その後、なぜソースプログラム .cpp を .c に変更するように言われたのかわかりませんでしたが、コンパイルはスムーズに進みました。

後でインターネットで、Linux では .c ファイルのコンパイルに gcc が使用されるのに対し、C++ ファイルでは C++ ソース プログラムのコンパイルに g++ コマンドが必要であることを知りました。

関連する推奨事項:

PHP を使用して訪問者の IP、地域の位置、ブラウザーとソース ページの情報を取得する

PHPstorm を使用した PHP の自動プロンプト機能の詳細な説明

以上がphp を使用して so ライブラリ ファイル内のコードを呼び出しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。