This is an old revision of the document!


  • Version: 1.0
  • Date: 2014-11-19
  • Author: Anatol Belski, ab@php.net
  • Status: Draft /* (or Under Discussion or Accepted or Declined) */

/* * First Published at: http://wiki.php.net/rfc/your_rfc_name */


Currently, to access module globals in TS mode, a global resource array is used. That array contains globals from all the threads and the right globals are identified by the thread key. In order to access the thread key, it is passed to each function requiring access to the globals. Or, it has to be fetched on demand. Consequently

  • many functions have to take an additional argument used only in TS mode, that makes code to be overloaded with TSRMLS_* macros
  • forgetting to declare/pass a TS parameter wouldn't do any harm in NTS mode (as those are all macros), but causes build breach in the TS
  • additionally it might introduce some C89 intompatibility in NTS mode when TSRMLS_FETCH() is used before var declarations
  • in some cases TS related code has to be explicitly conditioned with preprocessor directives (#ifdef ZTS)
  • when the thread id isn't passed directly, TSRMLS_FETCH() has to be used, which is slow

This RFC bases on https://wiki.php.net/rfc/tls , however I don't mention it under the “First Published” position. While the key points are the same, the patch and the meaning undergone some changes. Still teh base RFC contains a lot of useful info about cross platform compatibility and various TLS implementations, so I would say it is useful to briefly read through it as well.


The redundancy of passing thread id explicitly should be removed where possible. Ideally, one global thread specific variable should be used to hold the thread key (while it's not possible exactly the way on every platform, see the implementation details).

Backward Incompatible Changes

  1. thread id isn't passed explicitly anymore

Proposed PHP Version(s)


RFC Impact


Threading capable SAPIs may need to be reworked. Currently it regards only to Apache mpm_worker and mpm_winnt. See implemtation details.

To Existing Extensions

See implementation details.

Open Issues

The patch from the base RFC used an offset mechanism instead of the array indexing to access globals. That part wasn't ported in the current patch as it has caused too much issues. This however should be still done as using offsets would speedup the data access.

Unaffected PHP Functionality

Userland is not affected, the change is internals only.

Future Scope

  • faster data access using offsets instead of array indexes
  • depending on compiler evolution, fetching thread id per function could be replaced with a real global variable shared across all the binary units (.so, .dll, .exe)

Proposed Voting Choices

yes, no

50%+1 majority required

Patches and Tests



Rejected Features

Keep this updated with features that were discussed on the mail lists.*/

rfc/native-tls.1416394979.txt.gz · Last modified: 2017/09/22 13:28 (external edit)