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

不言
リリース: 2023-03-23 11:06:02
オリジナル
7256 人が閲覧しました

この記事の内容は、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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!