Linux で C を使用して PHP (SO にパッケージ化された) を拡張する方法

WBOY
リリース: 2016-08-08 09:21:27
オリジナル
1281 人が閲覧しました

この記事では主に、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
ログイン後にコピー
一部の過去のバージョンにはソース コード パッケージがないため、PHP を次のバージョンにアップグレードする必要があることに注意してください。ソースコードパッケージを提供するバージョン

3. /php-5.6.9/ext/ ディレクトリに移動し、ext_skel を使用して拡張スケルトンを生成します

cd ./php-5.6.9/ext
./ext_skel --extname=test
ログイン後にコピー

4. 構成ファイル /test/config.m4 を変更します

次の 2 行の dnl コメントをキャンセルします。

PHP_ARG_ENABLE(test, whether to enable test support,
dnl Make sure that the comment is aligned:
[  --enable-test           Enable test support])
ログイン後にコピー

C++ をコンパイルするには、test.c の名前を test.cpp に変更し、config.m4 に追加します。
PHP_REQUIRE_CXX()    
PHP_ADD_LIBRARY(stdc++, 1, EXTRA_LDFLAGS)
PHP_NEW_EXTENSION(test, test.cpp, $ext_shared)
ログイン後にコピー

5. php_test.h ファイルにコードを追加し、カスタム関数宣言を追加します。
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);
ログイン後にコピー

6. test.c/cpp にカスタム関数コードを追加します:

(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"
ログイン後にコピー
それ以外の場合、詳細については、別のブログを参照してください: http ://blog.csdn.net/maverick1990/article/details/46786685

(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[] */
};
ログイン後にコピー

(3) 最後に、ファイルの最後に testFunc 関数のコードを追加します。ここで他のカスタム関数を定義することもできます。
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
ログイン後にコピー
9. /root/php-5.6.9/ext/test/ ディレクトリに移動し、構成を生成します:
./configure --with-php-c/local/php/bin/php-config
ログイン後にコピー

10. make でエラーが発生した場合は、コンパイルが成功するまでコードを変更します。 。

make install でエラーが発生した場合は、変更後に、現在生成されている拡張モジュールをクリアする必要があります:

make
make install
ログイン後にコピー

その後、手順 7 からやり直します。

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
ログイン後にコピー

13. PHP サービスを再起動します
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;
?>
ログイン後にコピー

これは、コンパイルされた .so ファイルの php ソース コード パッケージのバージョンと、現在使用されている php のバージョンとの違いが原因です。php ソース コード パッケージの現在のバージョンをダウンロードし、拡張機能を再コンパイルする必要があります

著作権ステートメント。 : この記事はブロガーによるオリジナル記事です。ブロガーの許可なく転載を禁じます。

上記は、Linux 上で C を使用して PHP を拡張する方法 (so にパッケージ化されている) を、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。

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