1

計り知れない手間をかけた後、ようやく非常に単純な「Hello World」スタイルの PHP 拡張 dll を Windows で作成しました。ただし、DLL を正常に作成し、それを拡張機能フォルダーに配置し、それについて php.ini に通知しましたが、次のようになります。

PHP 警告: PHP の起動: \x81\xc2\xc0\x03L&\xc0\x03: モジュールを初期化できません\nモジュール API=16777522 でコンパイルされたモジュール\nモジュール API=20090626 でコンパイルされた PHP\nこれらのオプションは一致する必要があります\n行 0
警告: PHP の起動: ÀL&À: モジュールを初期化できません モジュール API=16777522 でコンパイルされたモジュール モジュール API=20090626 でコンパイルされた PHP これらのオプションは、行0の不明で一致する必要があります

私のPHP_API_VERSIONは20090626のようですが、何らかの理由で私のDLLはPHP_API_VERSIONが16777522であると考えています。

以下のチュートリアルは、拡張 dll のコンパイルに役立ちました: http://www.talkphp.com/vbarticles.php?do=article&articleid=49&title=creating-custom-php-extensions

自分で書いたので、問題の php 拡張機能のすべてのソース コードにアクセスできます。

Visual Studio ではなく、Borland C++ Builder v5.5 で dll を正常にコンパイルしています。

重要な場合に備えて、完全なソースを次に示します。

// Needed to make following two #includes compatible with borland header files
void __fastcall __assume(int t) {
  return;
}
typedef unsigned int socklen_t;
typedef enum BOOL
{
  false=0,
  true
} bool;
// end Borland compatibility code

#include "php.h"
#include "zend_config.w32.h"
ZEND_FUNCTION(fetch_LinkGrammar_links);

zend_function_entry LinkGrammar_ext_functions[] = {
    ZEND_FE(fetch_LinkGrammar_links, NULL)
    {NULL, NULL, NULL}
};

zend_module_entry LinkGrammar_ext_module_entry = {
    STANDARD_MODULE_HEADER,
    "LinkGrammar Extension",
    LinkGrammar_ext_functions,
    NULL, NULL, NULL, NULL, NULL,
    "1.0",
    STANDARD_MODULE_PROPERTIES
};

ZEND_GET_MODULE(LinkGrammar_ext);

ZEND_FUNCTION(fetch_LinkGrammar_links)
{
    bool World = false;
    char *RetVal= "";
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &World) == FAILURE)
    {
        RETURN_STRING("Missing Parameter", true);
    }
    if (World == true)
    {
        RetVal= "Hello World";
    }
    else
    {
        RetVal= "Hello";
    }

    RETURN_STRING(RetVal, true);
}

API が一致しなければならない PHP 起動エラーをなくすには、何を変更すればよいですか?

4

4 に答える 4

1

それは「データアライメント」であることが判明しました-私のDLLは「ワード」アライメントを使用してコンパイルされており、ダブルワードである必要がありました。

于 2010-11-11T01:35:42.020 に答える
0

インクルード パスを確認し、ファイル php.h を見つけて、そこにあるバージョンが実行中の php と一致することを確認します (phpinfo() の出力を確認すると、実行中のバージョンが見つかります)。

于 2010-11-07T05:58:19.990 に答える
0

zend_modules.h の API バージョンを、PHP サーバーが phpinfo() で示す API バージョンに変更する必要があります。

たとえば、phpinfo() の PHP 拡張 API が 20090523 の場合、zend_modules.h ファイルの API 番号を 20090523 に変更してから、プロジェクトを再構築する必要があります。

于 2012-12-29T13:31:28.117 に答える
0

実行しているバージョンとは異なるバージョンの PHP に対してコンパイルしているようです。

php.h をのぞいて探してみて#define PHP_API_VERSIONください。それがコンパイル対象です。

それはあなたのサーバーで実行されているのと同じバージョンですか?

于 2010-11-07T04:23:51.313 に答える