I upgraded the Apache to 2.2.27 on my FreeBSD box via portmaster. The upgrade went very smooth. After the upgrade, I found that Apache no longer rendered the PHP page correctly. In the other words, it displayed the source code of the PHP files instead of executing the code.
Before you start doing anything, please make sure that your website is not accessible from public. For example, most web applications like to include the password information in the source code, which is accessible by public if the PHP engine is failed. You may want to restrict the public access during the fix. The easiest way is to set up a .htaccess file and restrict the access by IP address.
Let’s come back to the fix. For some reasons, Apache/PHP team decide to make something fun to the FreeBSD sysadmin, because they think FreeBSD sysadmin have plenty of spare time. Here is what they decide to do:
Originally, we install Apache first, then we install PHP. When we install the PHP, we pick an option such that the PHP will install a PHP engine used by Apache. In the recent release, they decide to remove the engine from the standard PHP package. For example, if you simply use the portmaster to upgrade your PHP (In my case, PHP 5.4 and 5.5), the engine will be missing. That’s why Apache fails to render the PHP files.
Here is what you will need to do. I suggest you to finish reading the following before doing the fix. Trust me. It may save you couple hours.
First, make sure that Apache is working fine.
If you are using PHP 5.4, make sure that you install this port: /usr/ports/www/mod_php5. If you are using PHP 5.5, install this one instead: /usr/ports/www/mod_php55. Make sure that you select the ZTS option. You can do it by running:
sudo make config
Notice that installing this port will reinstall the PHP package (/usr/ports/lang/php5 or /usr/ports/lang/php55). Make sure that the ZTS option is selected in PHP package as well.
Now try to restart the Apache server. That should make the Apache to render the PHP files instead of dumping it.
#sudo /usr/local/etc/rc.d/apache stop #sudo /usr/local/etc/rc.d/apache start
Test the PHP files again. If you see the PHP result instead of PHP source code, congratulations! You are 20% done.
Now go back to the command line and run the following:
#List the PHP extensions installed by PHP php -m #Check whether the PHP extensions are loaded properly by PHP php -v
For some reasons, I noticed that many extensions were missing during the reinstallation, such as sessions, json etc. Let’s install them back:
#For PHP 5.4 cd /usr/ports/lang/php5-extensions #For PHP 5.5 cd /usr/ports/lang/php55-extensions sudo make reinstall clean
Don’t forget the pecl and related packages as well. After that, try to restart your Apache server and clean up the php extension configuration:
You will see a mess. Try to clean up the duplicated extensions and run the php -m and php -v again.
During the fix, I notice that everything works fine except for MySQL package. Interestingly, when I ran php -m, the mysql was available. However when I ran phpinfo(), it was missing. I found that this problem only happens with PHP 5.4, but not PHP 5.5. Therefore, I decided to remove the PHP 5.4 and loaded PHP 5.5 instead.
Simply repeat the installation and restart the server. If possible, try to reboot the machine.
So here is the summary:
- Remove PHP, Extensions and PECL packages (sudo make deinstall).
- Restart Apache (sudo /usr/local/etc/rc.d/apache stop; sudo /usr/local/etc/rc.d/apache start).
- Verify installed extensions with php -m; php -v; and phpinfo().
- Verify the result by loading the pages on the web.
- If your page is failed, try to find out which extension is missing by checking the error log, which is typically available in in /var/log/
Hope my solutions help!