Re: How to get script filename in module RINIT function
| From: | Bostjan Skufca | Date: | Mon, 09 Aug 2010 13:49:36 +0000 |
| Subject: | Re: How to get script filename in module RINIT function | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-49229@lists.php.net to get a copy of this message | ||
I don't think I made myself exactly clear.
There are 2 use cases I would like to consider:
1. CLI: by using "php /full/path/to/script.php" or "cd /full/path/to && php
script.php"
2. Apache DSO: going to http://www.domain.com/script.php which in turn
'executes' script "/full/path/to/script.php"
In both cases, in RINIT I would like to get full path (real path, if
possible) of this /full/path/to/script.php. Is this possible or is your way
the only viable solution (with performance penalty etc)?
(The $_SERVER['SCRIPT_FILENAME'] was just a method to explain what I would
like to have, albeit obviously a poor one:)
Thanks again,
b.
2010/8/9 Johannes Schlüter <johannes@php.net>
> On Mon, 2010-08-09 at 13:32 +0200, Bostjan Skufca wrote:
> > Hi all!
> >
> > I am developing a small PHP extension and I ATM can't figure out how to
> get
> > to $_SERVER['SCRIPT_FILENAME'] content while in PHP_RINIT or
> PHP_RSHUTDOWN
> > function. Can someone please hint me with this one?
>
> The simple answer is: You can't. The closest you can get is a char *
> SG(request_data).request_uri
>
> The more complex answer is: It is only stored for being used in
> $_SERVER. So you can read it from there. The engine has a "just in time"
> mode to avoid creating _SERVER when not needed, we need it so we first
> have to trigger the creation of that variable, then one can search
> through the global symbol table and then search in there:
>
>
> zval **server, **tmp;
> zend_auto_global_disable_jit("_SERVER", sizeof("_SERVER")-1 TSRMLS_CC);
> if (zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"),
> (void**)&server) == FAILURE || Z_TYPE_PP(server) != IS_ARRAY) {
> /* error handling */
> return;
> }
> if (zend_hash_find(Z_ARRVAL_PP(server), "SCRIPT_FILENAME",
> sizeof("SCRIPT_FILENAME"), (void**)&tmp) == FAILURE || Z_TYPE_PP(tmp) !=
> IS_STRING) {
> /* error handling */
> return;
> }
> /* work with tmp */
>
> As this accesses the userspace $_SERVER you should do this during RINIT,
> else the value might be wrong. While this adds some cost to every
> request (populating $_SERVER plus two hash lookups), it can be optimized
> a tiny bit by precalculating the hash and using zend_hash_quick_find().
>
> The code above is untested.
>
> johannes
>
>
>