Re: [PHP-I18N] What's the scope of putenv()?

[email protected] (Jochem Maas)
Newsgroups php.i18n
Message-ID <[email protected]>
Karen Andrien wrote:
> Hi there,
> 
> I'm researching how to implement timezones in PHP, and found a wealth
> of information on the subject.  For Linux users, it all seems to boil
> down to one recommendation:  use the putenv("TZ=xxx") statement.
> 
> The software I'm working on needs to be able to display a grid of hours
> for the current date, for a user in any timezone.  (The timezone can be
> passed to the script as, e.g., $_COOKIE['TZ'] = 'America/Vancouver'.) 
> So far so good.  putenv() will change the timezone environment variable
> and the operating system will take care of the rest transparently.
> 
> However, I haven't been able to find any information on the scope of
> the putenv() statement.  What happens if users from Vancouver and
> Toronto log on at the same time?
> 
> The PHP documentation says putenv() applies "for the current request"
> only, but several users on the documentation page disagree.  They claim
> that putenv() has changed the time zone for both the current request
> and other future requests at random.
> 
> Can anybody clarify the putenv() scope for me?
> 
> My best guess is that the scope is PHP request-level, but Apache
> session-level.  When putenv() is called, it applies to the current
> Apache session, and all future connections which happen to arrive on
> the same connection.  If this is true, I would simply have to restore
> putenv() to the default at the end of the script.

seems like a more than reasonable assessment. regardless of what it is
supposed to do there apparently seems to be problems for some people,
sometimes on some kinds of systems - given that fact you would be best off
restoring the ENV to the original state at the end of each script
(you might consider an auto_append_file directive to take care of such stuff.)

> 
> But I don't want to test this on my system in case I'm wrong.  I don't
> have a separate development machine.

nothing a quick 'apachectl graceful' won't fix :-)

> 
> Here are all the possibilities I've thought of:
>    * Current PHP request only
>    * Current PHP session only (including future requests)
>    * Current PHP process only (including random future requests)

this would seemingly point to the ENV var being set for the given apache
children process - every request is handled by an arbitrary child process
and there will be a number of them hanging around waiting to handle a
request at any given time (dependent on your apache conf.) and a child process
is usually set up to handle a given number of reuqest before being killed
off - that would more than account for the 'random' part.

>    * All of PHP (including other current requests)
> 
>    * Current Apache request only
>    * Current Apache connection only (including random future requests)
>    * All of Apache (including other current connections)
> 
>    * All of Linux (this is such a bad idea that I'm sure it's wrong)
> 
> Thanks very much,
> Karen Andrien
> 
> 
> __________________________________________________
> Do You Yahoo!?
> Tired of spam?  Yahoo! Mail has the best spam protection around 
> http://mail.yahoo.com 
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.