FAQ
Hi
I am currently developing a kind of application server based on PHP
language.
I use modifications I made on SAPI embed/.
I use threads massively.

In my application design, every thread can load different PHP modules. In
practise, modules are loaded just before php_request_startup() and they are
unloaded after php_request_shutdown()

The problem I face is that I randomly receive PHP warnings :
<br />
<b>Warning</b>: Module 'X7V3' already loaded in <b>Unknown</b> on line
<b>0</b><br />
<br />
<b>Warning</b>: Function registration failed - duplicate name -
XXXXXXXXXXXXXXXXXX in <b>Unknown</b> on line <b>0</b><br />
<br />
<b>Warning</b>: X7V3: Unable to register functions, unable to load in
<b>Unknown</b> on line <b>0</b><br /

I looked at Zend/zend_API.c and I realized that 2 variables, "module_count"
and "module_registry", are not thread safe and that there is a comment
recomending mutex use for these 2 variables.

I had asked for a Feature/Change request on bugs.php.net (#40668) but it has
been closed :s

Then I learnt (thank you Tony) that dl() function is deactivated in ZTS
mode and I also learnt from Tony that this kind of problem was not a
priority ...

I think it is important to settle this problem at least for IIS and Apache
Threadpool/Worker servers.

At last, I would like to share my view on ZTS vs mutex use :

Mutex :
pros : uses slightly less memory
cons : does not give possibility to create module spaces by thread - uses
more processor resource (as there is a mutualized lock for various threads)

ZTS :
pros : possibility to create module spaces - less processor
cons : slight impact on memory

This is why I propose to use a ZTS resource instead of mutex to make
"module_registry" thread safe.

The use of ZTS resources will give a thread the ability to have its own
module HashTable.

In both cases (mutex or ZTS resource), we will be able to reactivate the
dl() function in ZTS mode.

I propose to develop the ZTS version resource. Or shall I let you do it ?

Kind regards

Michael Vergoz

Search Discussions

  • Richard Lynch at Mar 1, 2007 at 10:06 pm
    On Thu, March 1, 2007 7:29 am, Michael Vergoz wrote:

    I don't claim to understand this issue fully/deeply, but I'm
    definitely +1 on resurrecting 'dl' if this change fixes everything to
    everyone's satisfaction.

    Not that my vote actually counts, as I've never had the skills/time to
    actually contribute C code to PHP.

    I may be the only user on the planet with a shared host that lets me
    use 'dl' to pull in extensions, but there it is, and I kinda need it,
    as there are no other viable options to do what I need to do, other
    than changing to a new webhost I might not like... :-)

    --
    Some people have a "gift" link here.
    Know what I want?
    I want you to buy a CD from some starving artist.
    http://cdbaby.com/browse/from/lynch
    Yeah, I get a buck. So?
  • Michael Vergoz at Mar 5, 2007 at 1:44 pm
    Hello,

    I made a patch that "mutex'ed" module_registry and module_count.
    For the moment it doesn't solve the dl().

    The patch for last CVS PHP_5_2
    http://mykii.binarysec.com/PHP/module_registry_mutex/module_register_mutex.patch

    Small description :
    http://mykii.binarysec.com/PHP/module_registry_mutex/readme.txt

    Regards,
    Michael Vergoz

    ----- Original Message -----
    From: "Richard Lynch" <ceo@l-i-e.com>
    To: "Michael Vergoz" <mv@binarysec.com>
    Cc: <internals@lists.php.net>
    Sent: Thursday, March 01, 2007 11:06 PM
    Subject: Re: [PHP-DEV] Thread safe problem on module_registry (Zend API
    Feature/Change request)

    On Thu, March 1, 2007 7:29 am, Michael Vergoz wrote:

    I don't claim to understand this issue fully/deeply, but I'm
    definitely +1 on resurrecting 'dl' if this change fixes everything to
    everyone's satisfaction.

    Not that my vote actually counts, as I've never had the skills/time to
    actually contribute C code to PHP.

    I may be the only user on the planet with a shared host that lets me
    use 'dl' to pull in extensions, but there it is, and I kinda need it,
    as there are no other viable options to do what I need to do, other
    than changing to a new webhost I might not like... :-)

    --
    Some people have a "gift" link here.
    Know what I want?
    I want you to buy a CD from some starving artist.
    http://cdbaby.com/browse/from/lynch
    Yeah, I get a buck. So?
  • Wez Furlong at Mar 7, 2007 at 6:09 am
    Just curious, why did you choose to mutex around a hash instead of
    using the zend_ts_hash functions?

    Changing the access semantics while preserving the type and name of
    that variable will cause any external modules that are unaware of that
    change to subtly break, or if you're lucky, crash hard.

    Seems "better" to make that break a little bit more obvious by
    changing the name, or introducing an API to encapsulate the correct
    access semantics.

    These are just suggestions. My main comments are that the locking
    macros are mildly ugly and that a lack of compile time enforcement on
    the new locking requirement will cause people pain with modules
    outside of the main php distribution.

    --Wez.


    On 3/5/07, Michael Vergoz wrote:
    Hello,

    I made a patch that "mutex'ed" module_registry and module_count.
    For the moment it doesn't solve the dl().

    The patch for last CVS PHP_5_2
    http://mykii.binarysec.com/PHP/module_registry_mutex/module_register_mutex.patch

    Small description :
    http://mykii.binarysec.com/PHP/module_registry_mutex/readme.txt

    Regards,
    Michael Vergoz

    ----- Original Message -----
    From: "Richard Lynch" <ceo@l-i-e.com>
    To: "Michael Vergoz" <mv@binarysec.com>
    Cc: <internals@lists.php.net>
    Sent: Thursday, March 01, 2007 11:06 PM
    Subject: Re: [PHP-DEV] Thread safe problem on module_registry (Zend API
    Feature/Change request)

    On Thu, March 1, 2007 7:29 am, Michael Vergoz wrote:

    I don't claim to understand this issue fully/deeply, but I'm
    definitely +1 on resurrecting 'dl' if this change fixes everything to
    everyone's satisfaction.

    Not that my vote actually counts, as I've never had the skills/time to
    actually contribute C code to PHP.

    I may be the only user on the planet with a shared host that lets me
    use 'dl' to pull in extensions, but there it is, and I kinda need it,
    as there are no other viable options to do what I need to do, other
    than changing to a new webhost I might not like... :-)

    --
    Some people have a "gift" link here.
    Know what I want?
    I want you to buy a CD from some starving artist.
    http://cdbaby.com/browse/from/lynch
    Yeah, I get a buck. So?
    --
    PHP Internals - PHP Runtime Development Mailing List
    To unsubscribe, visit: http://www.php.net/unsub.php
  • Michael Vergoz at Mar 7, 2007 at 7:46 am
    Hello Wez,

    Thanks for your feedback.
    Indeed the mutex that i placed isn't useful and in fact this is a test patch
    i made.
    I didn't know TsHashTable :)
    This says the mutex will not solve the problem to which i face.
    The dl() function can't work with ZTS.

    I coded other test source here :
    http://mykii.binarysec.com/PHP/Zend_API_module_registry_TSRM/first_shot.patch

    In fact the problem is deeper because there are other complex links as
    list_destructors that isn't TS whereas this one is used for the management
    of modules.

    The design of construction and destruction of the modules aren't adapted to
    TS environment.

    I think it's necessary to redesign the Modular aspect of PHP in order to
    solve these problems in-depth.

    I have some ideas about this subject but my time is very restricted.

    I propose to return to see you when I would have a serious proposal.

    Regards,
    Michael Vergoz

    ----- Original Message -----
    From: "Wez Furlong" <kingwez@gmail.com>
    To: "Michael Vergoz" <mv@binarysec.com>
    Cc: <ceo@l-i-e.com>; <internals@lists.php.net>
    Sent: Wednesday, March 07, 2007 7:09 AM
    Subject: Re: [PHP-DEV] Thread safe problem on module_registry (Zend API
    Feature/Change request)

    Just curious, why did you choose to mutex around a hash instead of
    using the zend_ts_hash functions?

    Changing the access semantics while preserving the type and name of
    that variable will cause any external modules that are unaware of that
    change to subtly break, or if you're lucky, crash hard.

    Seems "better" to make that break a little bit more obvious by
    changing the name, or introducing an API to encapsulate the correct
    access semantics.

    These are just suggestions. My main comments are that the locking
    macros are mildly ugly and that a lack of compile time enforcement on
    the new locking requirement will cause people pain with modules
    outside of the main php distribution.

    --Wez.


    On 3/5/07, Michael Vergoz wrote:
    Hello,

    I made a patch that "mutex'ed" module_registry and module_count.
    For the moment it doesn't solve the dl().

    The patch for last CVS PHP_5_2
    http://mykii.binarysec.com/PHP/module_registry_mutex/module_register_mutex.patch

    Small description :
    http://mykii.binarysec.com/PHP/module_registry_mutex/readme.txt

    Regards,
    Michael Vergoz

    ----- Original Message -----
    From: "Richard Lynch" <ceo@l-i-e.com>
    To: "Michael Vergoz" <mv@binarysec.com>
    Cc: <internals@lists.php.net>
    Sent: Thursday, March 01, 2007 11:06 PM
    Subject: Re: [PHP-DEV] Thread safe problem on module_registry (Zend API
    Feature/Change request)

    On Thu, March 1, 2007 7:29 am, Michael Vergoz wrote:

    I don't claim to understand this issue fully/deeply, but I'm
    definitely +1 on resurrecting 'dl' if this change fixes everything to
    everyone's satisfaction.

    Not that my vote actually counts, as I've never had the skills/time to
    actually contribute C code to PHP.

    I may be the only user on the planet with a shared host that lets me
    use 'dl' to pull in extensions, but there it is, and I kinda need it,
    as there are no other viable options to do what I need to do, other
    than changing to a new webhost I might not like... :-)

    --
    Some people have a "gift" link here.
    Know what I want?
    I want you to buy a CD from some starving artist.
    http://cdbaby.com/browse/from/lynch
    Yeah, I get a buck. So?
    --
    PHP Internals - PHP Runtime Development Mailing List
    To unsubscribe, visit: http://www.php.net/unsub.php
  • Edin Kadribasic at Mar 4, 2007 at 7:01 pm
    Hi Michael,

    Making dl() work on threaded platforms would be nice. Illustrating your
    idea with a patch would be very helpful.

    Edin


    Michael Vergoz wrote:
    Hi
    I am currently developing a kind of application server based on PHP
    language.
    I use modifications I made on SAPI embed/.
    I use threads massively.

    In my application design, every thread can load different PHP modules. In
    practise, modules are loaded just before php_request_startup() and they are
    unloaded after php_request_shutdown()

    The problem I face is that I randomly receive PHP warnings :
    <br />
    <b>Warning</b>: Module 'X7V3' already loaded in <b>Unknown</b> on line
    <b>0</b><br />
    <br />
    <b>Warning</b>: Function registration failed - duplicate name -
    XXXXXXXXXXXXXXXXXX in <b>Unknown</b> on line <b>0</b><br />
    <br />
    <b>Warning</b>: X7V3: Unable to register functions, unable to load in
    <b>Unknown</b> on line <b>0</b><br /

    I looked at Zend/zend_API.c and I realized that 2 variables, "module_count"
    and "module_registry", are not thread safe and that there is a comment
    recomending mutex use for these 2 variables.

    I had asked for a Feature/Change request on bugs.php.net (#40668) but it has
    been closed :s

    Then I learnt (thank you Tony) that dl() function is deactivated in ZTS
    mode and I also learnt from Tony that this kind of problem was not a
    priority ...

    I think it is important to settle this problem at least for IIS and Apache
    Threadpool/Worker servers.

    At last, I would like to share my view on ZTS vs mutex use :

    Mutex :
    pros : uses slightly less memory
    cons : does not give possibility to create module spaces by thread - uses
    more processor resource (as there is a mutualized lock for various threads)

    ZTS :
    pros : possibility to create module spaces - less processor
    cons : slight impact on memory

    This is why I propose to use a ZTS resource instead of mutex to make
    "module_registry" thread safe.

    The use of ZTS resources will give a thread the ability to have its own
    module HashTable.

    In both cases (mutex or ZTS resource), we will be able to reactivate the
    dl() function in ZTS mode.

    I propose to develop the ZTS version resource. Or shall I let you do it ?

    Kind regards

    Michael Vergoz

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
groupphp-internals @
categoriesphp
postedMar 1, '07 at 1:45p
activeMar 7, '07 at 7:46a
posts6
users4
websitephp.net

People

Translate

site design / logo © 2022 Grokbase