wiki:howto/PHP

Version 34 (modified by vladimir-xaro (Vladimir Slavgorodskiy), 15 months ago) (diff)

change to latest packages and remove non-existent package php8*-mssql (latest version of php56-mssql)

<- Back to the HOWTO section

About PHP

PHP is a popular server-side scripting language frequently used to develop web sites or command line scripts.

For information on integrating Apache with MySQL and PHP, see MAMP.

Versions

MacPorts includes several versions of PHP. You can install any or all of these versions simultaneously, though it is expected that you will only need to install one of them.

  • php82: PHP v8.2.x. This is the latest stable version. Security support until 8 Dec 2025.
  • php81: PHP v8.1.x. This is an older stable version. Security support until 25 Nov 2024.
  • php80: PHP v8.0.x. This is an older stable version. Security support until 26 Nov 2023.
  • php74: PHP v7.4.x. This version reached end of life on 28 Nov 2022.
  • php73: PHP v7.3.x. This version reached end of life on 6 Dec 2021.
  • php72: PHP v7.2.x. This version reached end of life on 30 Nov 2020 and is therefore not recommended.
  • php71: PHP v7.1.x. This version reached end of life on 1 Dec 2019 and is therefore not recommended.
  • php70: PHP v7.0.x. This version reached end of life on 10 Jan 2019 and is therefore not recommended.
  • php56: PHP v5.6.x. This version reached end of life on 31 Dec 2018 and is therefore not recommended.
  • php55: PHP v5.5.x. This version reached end of life in 2016 and is therefore not recommended.
  • php54: PHP v5.4.x. This version reached end of life in 2015 and is therefore not recommended.
  • php53: PHP v5.3.x. This version reached end of life in 2014 and is therefore not recommended.
  • php52: PHP v5.2.x. This version reached end of life in 2011 and is therefore not recommended.

This page shows how to install and use the php82 family of ports, but you can use another version if you prefer; all of these ports use a similar directory layout.

Step 1: Install PHP SAPIs

PHP comes in several Server APIs (SAPIs). You can install any or all of these that you need:

SAPI Port Install command
Command line php82 sudo port install php82
Apache 2 module php82-apache2handler sudo port install php82-apache2handler
FastCGI php82-cgi sudo port install php82-cgi
FastCGI Process Manager php82-fpm sudo port install php82-fpm

Step 2: Install PHP Modules

The SAPI ports contain the core PHP features, but there are many optional features available in separate ports, some of which you may want to install as well. Use port search php82 to see all the ports that are available.

Installing a PHP module automatically makes it available to all PHP SAPIs of the same PHP version.

For example, if you with to interact with a database server, here are some of the choices that exist:

Database server Port Install command
MySQL, MariaDB, Percona php82-mysql sudo port install php82-mysql
ODBC php82-odbc sudo port install php82-odbc
Oracle php82-oracle sudo port install php82-oracle
PostgreSQL php82-postgresql sudo port install php82-postgresql
SQLite php82-sqlite sudo port install php82-sqlite

Step 3: PHP Configuration file setup

Set up your PHP configuration files. For development purposes use:

$ cd /opt/local/etc/php82
$ sudo cp php.ini-development php.ini

or for a production server:

$ cd /opt/local/etc/php82
$ sudo cp php.ini-production php.ini

then make changes to that newly created php.ini file - /opt/local/etc/php82/php.ini

Step 4: Install phpMyAdmin

Use MacPorts to install the latest version of phpMyAdmin.

$ sudo port install phpmyadmin

phpMyAdmin must be configured before it can be used. We do this in Step 5 below.

Step 5: Visit howto/MAMP for integration information

howto/MAMP must be consulted next for modifications to the Apache Configuration file to enable PHP and MySQL.

Trouble shoot

If by some reason the server still doesn't interpret PHP files (i.e. your web client tries to download them) it means the PHP configurations, as described at howto/MAMP#job1, are not taking effect. Typically, the file "Include etc/apache2/extra/mod_php82.conf" - is not being processed; the file is missing; or the contents incorrect. That file contains the two "AddType" lines below.

Verify your config file again!

Verify any changes you have made to the config file: /opt/local/etc/apache2/httpd.conf - The most common problem is that the files in the "extra" directory are not "readable" All files in that directory should be "-rw-r--r--"

$ /opt/local/sbin/apachectl -t

This will return either "Syntax OK" or a specific line by line error listing.

The typical error message: "Could not open configuration file /opt/local/etc/apache2/extra/httpd-mod_php82.conf: Permission denied"

After correcting any config errors and saving the updated config file, simply run:

$ sudo port unload apache2

to stop apache (even though it is not running) and then start it using

$ sudo port load apache2

to start it again.

If the above fails to cause php files to be interpreted, you can edit the Apache httpd.conf file itself again and search for the block:

<IfModule mime_module>

And then add the following two lines before the end of that block.

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

Then restart the server.

As a last check, reboot and verify that everything has autostarted and is running (i.e., repeat the above tests).

Step 6: Configure phpMyAdmin

Step 4 was the installation of phpMyAdmin. Next let's configure and test if phpMyAdmin can access MySQL.

First create the config.inc.php file:

$ cd /opt/local/www/phpmyadmin/
$ sudo cp config.sample.inc.php config.inc.php

Assuming that you have /Users/username/Sites as DocumentRoot for Apache, copy and paste phpMyAdmin in it :

$ sudo cp -R /opt/local/www/phpmyadmin/ /Users/username/Sites/phpmyadmin

To check your phpMyAdmin installation, point your browser to http://localhost/phpmyadmin and verify that phpMyAdmin loads and you get it's login page. Try to login as root with the MySQL password for root.
There is a fair chance you can't login and will see two pink colored boxes with cryptic error codes in it. The reason for it is, that mySQL uses strong encryption,
that phpMyAdmin can't handle. So let's change the encryption for the user root in mySQL to a weaker level:

$ mysql -u root -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'here your password for root';
mysql> exit

Now accessing databases in MySQL with phpMyAdmin should work. Installing a CMS like Drupal, Joomla or WordPress should be a piece of cake. First step is to create in mysql a new user and the new user's database. Next download for example WordPress and copy it's files into your DocumentRoot. When installing WP, you will see that macOS prevents WP from creating the file wp-config.php in your DocumentRoot. Create that file manually and copy in it the contents provided by WP. Continue the installation, and in less than a minute your Wordpress website is up and running. Excellent job done !!


There is no need to edit the config.inc.php file, so feel free to skip the following lines and goto Step 7:
However if you are a curious person, check the following: locate in this config file the line:

$cfg['Servers'][$i]['auth_type']   = 'cookie';    // Authentication method (config, http or cookie based)? - default is Cookie.

It will be right at the beginning in the section labeled: "/* Authentication type */"

Instead of the default value 'cookie', you might consider changing it to 'config' or 'http'. Details on the three different options can be found in the chapter 'using-authentication-modes' in the phpmyadmin manual.

If you want to consult the phpMyAdmin manual, copy it into your DocumenRoot :

$ cp -R /opt/local/www/phpmyadmin/doc/html /Users/username/Sites/phpmyadmin-doc

Open localhost/phpmyadmin-doc in your browser et voilà! There it is.

Step 7: Install pmadb

Some consider the installation of pmadb "optional."
However, phpMyAdmin will flag the fact that it is missing and therefore certain features are not functional, with the message:

The phpMyAdmin configuration storage is not completely configured, some extended features have been deactivated. Find out why. 
      Or alternately go to 'Operations' tab of any database to set it up there.

For additional features provided by pmadb (http://wiki.phpmyadmin.net/pma/pmadb), first run

$ mysql -u root -p < /opt/local/www/phpmyadmin/sql/create_tables.sql

Next: create a file: mysql_phpMyAdmin_pmaSetup.sql - containing the following SQL code: (change the 'pmapass' to your password)

  • this is a one-time use scratch file so you can place it anywhere and delete it after use. (It is not included with the phpMyAdmin distribution.)

Note: In MySQL versions beginning with 5.6.7, there is no mysql.host table, so you will need to edit the SQL code below: (i) in lines 9 and 17 delete "Host," from the the GRANT SELECT commands; and (ii) delete the line 16 command "GRANT SELECT ON mysql.host TO 'pma'@'localhost';".

-- HOW TO USE THIS FILE (with MacPorts installation)
-- mysql -u root -p < /opt/local/www/phpmyadmin/examples/create_tables.sql
-- mysql -u root -p < mysql_phpMyAdmin_pmaSetup.sql

CREATE USER 'pma'@'localhost' IDENTIFIED BY 'pmapass';

GRANT USAGE ON mysql.* TO 'pma'@'localhost' IDENTIFIED BY 'pmapass';
GRANT SELECT (
    Host, User, Select_priv, Insert_priv, Update_priv, Delete_priv,
    Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv,
    File_priv, Grant_priv, References_priv, Index_priv, Alter_priv,
    Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv,
    Execute_priv, Repl_slave_priv, Repl_client_priv
    ) ON mysql.user TO 'pma'@'localhost';
GRANT SELECT ON mysql.db TO 'pma'@'localhost';
GRANT SELECT ON mysql.host TO 'pma'@'localhost';
GRANT SELECT (Host, Db, User, Table_name, Table_priv, Column_priv)
    ON mysql.tables_priv TO 'pma'@'localhost';

-- Privileges
GRANT SELECT, INSERT, DELETE, UPDATE ON `phpmyadmin`.* TO 'pma'@localhost;

Then run this SQL to setup the pma 'controluser'

Finally, verify that the config file, at /opt/local/www/phpmyadmin/config.inc.php, is like this:
Note: The database name is pma underscore underscore -- two underscores!

/* User used to manipulate with storage */
// $cfg['Servers'][$i]['controlhost'] = '';                                                                                             
// $cfg['Servers'][$i]['controlport'] = '';    
$cfg['Servers'][$i]['controluser'] = 'pma';
$cfg['Servers'][$i]['controlpass'] = 'pmapass';
/* Storage database and tables */
// $cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';                                                                                         
// $cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';                                                                              
// $cfg['Servers'][$i]['relation'] = 'pma__relation';                                                                                   
// $cfg['Servers'][$i]['table_info'] = 'pma__table_info';                                                                               
// $cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';                                                                           
// $cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';                                                                                 
// $cfg['Servers'][$i]['column_info'] = 'pma__column_info';                                                                             
// $cfg['Servers'][$i]['history'] = 'pma__history';                                                                                     
// $cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';                                                                         
// $cfg['Servers'][$i]['tracking'] = 'pma__tracking';                                                                                   
// $cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';                                                                               
// $cfg['Servers'][$i]['recent'] = 'pma__recent';                                                                                       
// $cfg['Servers'][$i]['favorite'] = 'pma__favorite';                                                                                   
// $cfg['Servers'][$i]['users'] = 'pma__users';                                                                                         
// $cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';                                                                               
// $cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';                                                                   
// $cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';                                                                         
// $cfg['Servers'][$i]['central_columns'] = 'pma__central_columns';