|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2009-02-16 20:58 UTC] tser at deltacontrols dot com
Description:
------------
Using FastCGI with IIS, the PHP_MSHUTDOWN_FUNCTION of any extensions are not being called when the php_cgi.exe process is recycled.
PHP_MINIT_FUNCTION(xxx)
{
REGISTER_INI_ENTRIES();
}
PHP_MSHUTDOWN_FUNCTION(xxx)
{
UNREGISTER_INI_ENTRIES();
return SUCCESS;
}
It happens on our custom extension and any standard extension.
It could be easily duplicatable even by putting a break point on
PHP_MSHUTDOWN_FUNCTION in php_date.c
Reproduce code:
---------------
<?phpinfo();?>
Expected result:
----------------
PHP_MSHUTDOWN_FUNCTION being called.
Actual result:
--------------
PHP_MSHUTDOWN_FUNCTION not being called.
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Tue Oct 28 08:00:01 2025 UTC |
Using Vista64 IIS7 with the update (KB980363). 1. Setup PHP FactCGI in IIS. Everything default. 2. Open C:\Windows\System32\inetsrv\config\applicationHost.config Edit the <fastCgi> section and add signalBeforeTerminateSeconds="30" <fastCgi> <application fullPath="C:\Program Files (x86)\PHP\php-cgi.exe" maxInstances="2" idleTimeout="30001" activityTimeout="3000" instanceMaxRequests="10000" signalBeforeTerminateSeconds="30"> <environmentVariables> <environmentVariable name="PHP_FCGI_MAX_REQUESTS" value="10000" /> <environmentVariable name="PHPRC" value="C:\Program Files (x86)\PHP\" /> </environmentVariables> </application> </fastCgi> 3. Create a test.php with <?phpinfo();?>. Browse it. 4. Attach debugger to php-cgi.exe process (with debug symbol). 5. Put a breakpoint in sapi/cgi/fastcgi.c (after WaitForSingleObject) static DWORD WINAPI fcgi_shutdown_thread(LPVOID arg) { HANDLE shutdown_event = (HANDLE) arg; WaitForSingleObject(shutdown_event, INFINITE); in_shutdown = 1; <--------------breakpoint here return 0; } 6. Put a break point in ext/date/php_date.c PHP_MSHUTDOWN_FUNCTION(date) { UNREGISTER_INI_ENTRIES(); return SUCCESS; <----------------breakpoint here } 7. Open a command prompt and do a iisreset. Notice that the breakpoint in fcgi_shutdown_thread will get hit but the PHP_MSHUTDOWN_FUNCTION(date) function is not being called. Before the IIS updates, FastCGI module always force kill php-cgi.exe, make it impossible for php-cgi.exe to properly call PHP_MSHUTDOWN_FUNCTION for each extension. With the new setting signalBeforeTerminateSeconds, "_FCGI_SHUTDOWN_EVENT_" will be triggered to give php-cgi.exe a change to do proper cleanup. There are actually code in fastcgi.c (PHP) to wait for that event. However, it still does not properly call PHP_MSHUTDOWN_FUNCTION for all the loaded extension.