PHP with Database, Redis and Composer

This section will guide you through the setup of a complex PHP project using the Riptide repository.

We will use a Nginx web server and PHP-FPM.

This guide assumes you have Riptide fully set up, with shell integration enabled and a running proxy server (for this guide we assume https://riptide.local as base URL of your proxy server). It also assumes you have the repos part of the configuration set to only the Riptide Community Repository (the default).

PHP and Nginx do NOT need to be installed for this guide.

Preparing the project

For this guide we will set up a PHP file.

Create a new directory and create an index.php in it with the following contents:

<?php
require_once "vendor/autoload.php";

$hello = new Rivsen\Demo\Hello();
echo $hello->hello();

This PHP file tries to load the autoloader supplied by Composer and then tries to load a class from the rivsen/hello-world package.

We will also be setting up Redis and a MySQL database, however our simple PHP example will not use them. You can experiment with your own PHP code to access them, this guide will give you everything you need for this (aside from PHP knowledge).

We also need a composer.json with the requirement for this package:

{
    "name": "phpcomplex-helloworld",
    "require": {
        "rivsen/hello-world": "*"
    }
}

Instead you can also run composer require rivsen/hello-world later on, after we added the composer command.

Creating a riptide.yml with nginx and php-fpm

Create a riptide.yml with the following contents:

project:
  name: phpcomplex-helloworld
  src: .
  app:
    name: phpcomplex-helloworld
    services:
      nginx:
        $ref: /service/nginx/latest
        roles:
          - src
          - main
        config:
          default_nginx_conf:
            from: default_nginx.conf
            to: '/etc/nginx/conf.d/default.conf'
        pre_start:
          # Wait for php (otherwise nginx crashes) :(
          - "until ping -c5 php &>/dev/null; do :; done"
      php:
        $ref: /service/php/7.2/fpm
        roles:
          - src
          - php

The PHP service is nearly the same as in the riptide.yml of the simple example.

We just added the role php and switched the reference to the fpm variant. This variant does not container Apache but instead PHP and PHP-FPM. The role php is used, so that we can later use the /command/php/from-service command from the repository.

We added the new service nginx. This service is also based on a service from the repository and also get’s access to the source code.

In config we tell Riptide to take the default_nginx.conf and put it to /etc/nginx/conf.d/default.conf in the container.

The default_nginx.conf contains the server settings for Nginx. We connect PHP and Nginx there. This is the contents of this file:

server {
    listen 80;
    root /src;
    index index.php;
    server_name {{ domain() }};
    location ~* \.php$ {
        fastcgi_index   index.php;
        fastcgi_pass    php:9000;
        include         fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
    }
}

As you can see, we tell Nginx to use the service php as a FastCGI backend for all php files. The service php contains php-fpm and nginx will communicate with it to process php files.

Since this is a config file, variables and variable helper functions can be used in this file. In this case we use the domain() helper. Riptide will process the file, look for all template strings ( {{ something }} ) and replace them. The helper domain() returns the domain of the proxy server that our project is accessible under. So when the service is started this line will actually say something like server_name phpcomplex-helloworld.riptide.local;.

In pre_start for nginx we make sure that nginx doesn’t get started before php does, because otherwise nginx would crash.

Adding commands for Composer

Next we need to add the php and composer commands to our project, so that we can run composer to install express from the composer.json.

Add the following under app in the riptide.yml:

commands:
  php:
    $ref: /command/php/from-service
  composer:
    $ref: /command/composer/with-host-links

This adds two new commands, one containing PHP and one containing PHP and the newest Composer version. All composer processes started will also have access to the directory .composer in your home directory and .ssh.

Those commands come from the Riptide repository, if you want to know how they work, visit the repository:

Installing requirements

If you have the shell integration enabled, leave and enter the directory again, this will load the configured php and composer commands. You can now run composer install, which will install the dependencies and create a directory named vendor.

Running the project setup

Run riptide setup --skip to initiate the project. Since we have not added any setup instructions or files to import, we just skip the setup with the --skip flag.

Starting the project

Open the front page of the Proxy server (https://riptide.local). You will find a new project called php-helloworld.

Click on the link and the project will start. After it starts you will see the “Hello World!” message telling you, that the project works.

Adding Redis

To add redis, add a new service under services:

redis:
  $ref: /service/redis/4.0

You can start this service using the Riptide CLI:

$ riptide start
Starting services...

nginx: 2/2|█████████████████████████████████████████████████████████████| Already started!
php  : 2/2|█████████████████████████████████████████████████████████████| Already started!
redis: 4/6|████████████████████████████████████████▋                    | Checking...

Try to write PHP code to access Redis! Since the service is named redis, you will be able to access Redis under the hostname redis.

Adding MySQL

To add a MySQL database, add a new service under services:

db:
  $ref: /service/mysql/5.6
  driver:
    name: mysql
    config:
      database: db
      password: password

You can specify the database and password. Username is always root.

This is using the MySQL service from the repository and the MySQL database driver. The database driver enables the database management features of Riptide.

Database driver are separate packages that need to be installed. The package for MySQL can be installed via pip install riptide-db-mysql (Github).

When you start the database via riptide start you can access it.

Try to write PHP code to access the database! Since the service is named db, you will be able to access MySQL under the hostname db.

The database driver also provides a way to directly access the database. When you enter riptide status you can see the port on which you can access the database from the host system.

Enable logging

See the simple example.

Adding files for import and setup instructions

See the simple example.