2

Linux で PHP 5.4.0 を実行しています。

ZEND_MINIT_FUNCTION のコードは次のとおりです。

#ifdef ZTS
ts_allocate_id( &sample_globals_id,
    sizeof(zend_sample_globals),
    (ts_allocate_ctor) php_sample_init_globals,
    (ts_allocate_dtor) php_sample_destroy_globals);
#else
    php_sample_init_globals(& sample_globals TSRMLS_CC);
#endif

モジュールが MSHUTDOWN を終了すると、このコードはクラッシュします。GDB は TSRM.c 、この行 (dtor への呼び出し) を指します。

if (p->storage[j]) {
    if (resource_types_table && !resource_types_table[j].done && resource_types_table[j].dtor) {
    resource_types_table[j].dtor(p->storage[j], &p->storage);
    }
free(p->storage[j]);
}

さらに奇妙なことに、デストラクタ関数を NULL に置き換えると、機能します。このような:

ts_allocate_id( &sample_globals_id,
    sizeof(zend_sample_globals),
    (ts_allocate_ctor) php_sample_init_globals,
    NULL ); //Works, but destructor is not called

なぜこれが起こるのか、おそらく誰かが考えているでしょうか?ありがとうございました

4

1 に答える 1

2

それを見つけた。奇妙なことに、これはどのチュートリアルにも記載されていませんが、答えは ext ディレクトリのソース コードにあります。

次のコードを MSHUTDOWN に追加しました

#ifdef ZTS
    ts_free_id(sample_globals_id); 
#endif

そして今、それはうまくいきます。ふぅ…

于 2012-04-18T10:56:58.890 に答える