Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Apache doesn't load PHP MySQL extension but IIS does

I have a really irritating problem with PHP on Windows Server 2008 R2. IIS and Apache are running on the same machine (Apache is embedded with another product and it being there is not my choice).

IIS is configured to be able to use multiple versions of PHP, and none of the PHP versions on there were installed with the Windows installer (so php.exe does not exist in the path).

Apache uses one particular version of PHP (5.2.5 Thread-safe - again I can't change this as a 3rd-party application has PHP extensions compiled against this version).

If I check phpinfo() in my Apache site it doesn't have an entry for MySQL, even though php_mysql.dll is enabled in php.ini and it exists in the \ext directory. If I (temporarily) add this version of PHP (same directory, same php.ini) to IIS and set up a test site with phpinfo() it correctly lists MySQL. I know this is not just some strange issue with phpinfo because I have a MySQL-based PHP site running in Apache and it fails with Call to undefined function mysql_connect()

It was suggested that I copy libmysql.dll from the PHP directory to C:\Windows\System32 but this made no difference. As there are multiple versions of PHP on the server I suppose it's possible that the wrong version of libmysql.dll is being loaded, but the PATH doesn't include any directories containing libmysql.dll.

IIS and Apache are looking at exactly the same PHP installation, php.ini, and ext directory, but only IIS can load the MySQL extension. Apache is on the default System account as it looks like System has access to all the DLLs.

The Apache logs say nothing about any DLLs failing to load. I'm logging PHP errors in the event log but nothing is reported about those extensions.

After Googling around the issue I found other suddenly-occurring issues in PHP on Windows server but the usual resolutions - rebuilding php.ini, restarting IIS, restarting the server - haven't helped.

Any suggestions on where to look next are much appreciated!

like image 715
tomfumb Avatar asked Mar 27 '12 01:03

tomfumb


2 Answers

I know this might not ultimately answer your question but, did you try configuring Apache to execute PHP through FastCGI (mod_fcgid) and use the same binary as IIS does ?

I know you are using mod_php, but calling it via FastCGI will abstract PHP from the webserver process. If extensions are loading fine under PHP called via FastCGI, there is no reason it won't work on a different web server.

Also, I personally beleive that it is a better idea this way since PHP is only called when a *.php file is requested. This way, Apache will not load PHP in memory for every request, which will give you better performance for serving static files, for example.

Update

To do this, you need to download mod_fcgid from http://httpd.apache.org/mod_fcgid/, load the module in your Apache configuration this way,

LoadModule fcgid_module modules/mod_fcgid.so  

And then, just specify what binary you want to call when PHP pages are requested:

AddHandler fcgid-script .php  
FcgidWrapper "c:/php/php-cgi.exe" .php  

Then, files with a .php extension will now be executed by the PHP FastCGI wrapper. Just be sure to specify the same php-cgi.exe binary as IIS is using.

All extensions that were previously available in IIS should now be available in Apache since the PHP installation behind is the same in both environment.

Keep me updated.

like image 93
Pierre-Olivier Avatar answered Oct 23 '22 04:10

Pierre-Olivier


1.- check php.ini path in phpinfo.

2.- add php folder to the windows path

http://www.computerhope.com/issues/ch000549.htm

3.- add directive PHPINIDir to apache conf

http://php.net/manual/en/install.windows.apache2.php

4.- uncomment mysql extension in respective php.ini

5.- reload apache

6.- check mysql extension in phpinfo

and please don't copy any files to system32

like image 34
ZiTAL Avatar answered Oct 23 '22 04:10

ZiTAL