Blog

Install PHP7.2 NGINX and PHP7.2-FPM on Ubuntu 16.04

########## Install NGINX ##############

# Install software-properties-common package to give us add-apt-repository package
sudo apt-get install -y software-properties-common

# Install latest nginx version from community maintained ppa
sudo add-apt-repository ppa:nginx/stable

# Update packages after adding ppa
sudo apt-get update

# Install nginx
sudo apt-get install -y nginx

# Check status
sudo service nginx status

# Start nginx if it is not already running
sudo service nginx start

# At this point you should have NGINX up and running, open http://localhost on your 
# browser and you should see a welcome page from NGINX

######### Install PHP7.2 and PHP7.2-FPM ################

# check what is the latest PHP version supplied by UBUNTU
sudo apt-cache show php

# You should get something like below where 'Version' would tell us the latest version available in my case is 7.0

# Package: php
# Architecture: all
# Version: 1:7.0+35ubuntu6.1
# Priority: optional
# Section: php
# Source: php-defaults (35ubuntu6.1)
# Origin: Ubuntu
# Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
# Original-Maintainer: Debian PHP Maintainers <pkg-php-maint@lists.alioth.debian.org>
# Bugs: https://bugs.launchpad.net/ubuntu/+filebug
# Installed-Size: 11
# Depends: php7.0
# Filename: pool/main/p/php-defaults/php_7.0+35ubuntu6.1_all.deb
# Size: 2862
# MD5sum: c5db88de62d1dcb9679e9ae328d7c94a
# SHA1: 49d3f1d1850ac867fedf6fbc5635c33227dfde53
# SHA256: 0b1ccf22b958163669e677d6f660888eec7951d6eda3ae0f49a8e3409773cd87
# Description: server-side, HTML-embedded scripting language (default)
# Description-md5: b955c03ceec2872c327e77278c943d6a
# Phased-Update-Percentage: 90
# Supported: 5y


# Add Repository which gives us the latest php version 7.2
sudo add-apt-repository ppa:ondrej/php

# Update packages after adding ppa
sudo apt update

# Lets now check what is the latest PHP version available now after the repository is added
sudo apt-cache show php

# You should now get something like below and notice the latest version is changed i.e Version: 1:7.2+60+ubuntu16.04.1+deb.sury.org+1

# Package: php
# Source: php-defaults (60+ubuntu16.04.1+deb.sury.org+1)
# Priority: optional
# Section: php
# Installed-Size: 12
# Maintainer: Debian PHP Maintainers <pkg-php-maint@lists.alioth.debian.org>
# Architecture: all
# Version: 1:7.2+60+ubuntu16.04.1+deb.sury.org+1
# Depends: php7.2
# Filename: pool/main/p/php-defaults/php_7.2+60+ubuntu16.04.1+deb.sury.org+1_all.deb
# Size: 5654
# MD5sum: 1089c40cb9763d667b1ba2bfb0b6b2c4
# SHA1: d34c619a14854708f43ae432daf5fe5e73737072
# SHA256: 6b2b24f7232f980818a688f66fd3f9759ac9d1eb0466dee30faa5b2f4c2b36df
# Description: server-side, HTML-embedded scripting language (default)
# Description-md5: 2ccdfdb6b598dc9bdf5572917b808dcb

# Lets now install php7.2 and some important modules which we will need.

sudo apt-get install php7.2-cli php7.2-fpm php7.2-curl php7.2-gd php7.2-mysql php7.2-mbstring zip unzip

# Some modules require you to authenticate installation and prompt you for some information such as:

# Please select the geographic area in which you live. Subsequent configuration questions will narrow this down by presenting a list
# of cities, representing the time zones in which they are located.

#  1. Africa   3. Antarctica  5. Arctic  7. Atlantic  9. Indian    11. SystemV  13. Etc
#  2. America  4. Australia   6. Asia    8. Europe    10. Pacific  12. US


# Geographic area: 8

# Please select the city or region corresponding to your time zone.

#  1. Amsterdam   9. Brussels     17. Guernsey     25. Lisbon      33. Monaco     41. Rome        49. Stockholm  57. Vienna
#  2. Andorra     10. Bucharest   18. Helsinki     26. Ljubljana   34. Moscow     42. Samara      50. Tallinn    58. Vilnius
#  3. Astrakhan   11. Budapest    19. Isle_of_Man  27. London      35. Nicosia    43. San_Marino  51. Tirane     59. Volgograd
#  4. Athens      12. Busingen    20. Istanbul     28. Luxembourg  36. Oslo       44. Sarajevo    52. Tiraspol   60. Warsaw
#  5. Belfast     13. Chisinau    21. Jersey       29. Madrid      37. Paris      45. Saratov     53. Ulyanovsk  61. Zagreb
#  6. Belgrade    14. Copenhagen  22. Kaliningrad  30. Malta       38. Podgorica  46. Simferopol  54. Uzhgorod   62. Zaporozhye
#  7. Berlin      15. Dublin      23. Kiev         31. Mariehamn   39. Prague     47. Skopje      55. Vaduz      63. Zurich
#  8. Bratislava  16. Gibraltar   24. Kirov        32. Minsk       40. Riga       48. Sofia       56. Vatican

# Time zone: 27

# Once done all basic modules will be installed now, lets check the version now

php -v

# PHP 7.2.2-3+ubuntu16.04.1+deb.sury.org+1 (cli) (built: Feb  6 2018 16:11:23) ( NTS )
# Copyright (c) 1997-2018 The PHP Group
# Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
#    with Zend OPcache v7.2.2-3+ubuntu16.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies


# Lets also check if the PHP7.2-FPM is running, if not start it

sudo service php7.2-fpm status

sudo service php7.2-fpm start  # (if the service isn't running already)

# Now we need to configure the Gateway so that PHP-FPM uses the UNIX socket for executing PHP files.
# For this we need to check where is the PHP7.2-fpm service running from and where are their configurations stored

sudo ps aux | grep php # (this will list php process)

# You will see the output something like below depending on how many processes are running

# root     13122  0.0  0.0 412040 14752 ?        Ss   12:17   0:00 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf)
# www-data 13123  0.0  0.0 412040  8424 ?        S    12:17   0:00 php-fpm: pool www
# www-data 13124  0.0  0.0 412040  8424 ?        S    12:17   0:00 php-fpm: pool www
# root     13126  0.0  0.0  11288   868 pts/1    S+   12:17   0:00 grep --color=auto php

# You will see the php-fpm master process is its location as /etc/php/7.2/fpm/php-fpm.conf. We now need to check the socket details
# from the PHP7.2-fpm by view this file.

vim /etc/php/7.2/fpm/php-fpm.conf

# You will see at the end of the file something like 'include=/etc/php/7.2/fpm/pool.d/*.conf' which means this process manager is using configurations from
# the pool.d directory. When viewing the /etc/php/7.2/fpm/pool.d/www.conf you will see that the PHP7.2-fpm (process manager) is 
# listening to the socket at 'listen = /run/php/php7.2-fpm.sock'
# Copy the socket location i.e. /run/php/php7.2-fpm.sock and we will use this socket to tell nginx to use this socket

vim /etc/nginx/site-available/default

# You will need to tell NGINX to process the index.php files as well so replace the following line

# index index.html index.htm index.nginx-debian.html;
# to
# index index.html index.htm index.php;

# Also you will see something like the following block for 'location'

#location ~ \.php$ {
#       include snippets/fastcgi-php.conf;
#
#       # With php-fpm (or other unix sockets):
#       fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
#       # With php-cgi (or other tcp sockets):
#       fastcgi_pass 127.0.0.1:9000;
#}

# Make changes so to the above block so you have the following one:

location ~ \.php$ {
       include snippets/fastcgi-php.conf;
#
#       # With php-fpm (or other unix sockets):
       fastcgi_pass unix:/run/php/php7.2-fpm.sock;
#       # With php-cgi (or other tcp sockets):
#       fastcgi_pass 127.0.0.1:9000;
}

# Note we have uncommented the location, and fastcgi_pass lines and also pasted the correct socket that
# is used by our php7.2-fpm (process manager)


# lets now restart both nginx and php7.2-fpm

sudo service nginx reload
sudo service php7.2-fpm restart


# Now lets create a index.php file within the document root i.e. root /var/www/html;

touch /var/www/html/index.php

# and put phpinfo() and save it.


# now open http://localhost and you should see the screen with all php information

How to duplicate a MySQL table, including indexes and data?

There are MySQL GUI and tools that makes table duplication easy. But sometimes, you wish to copy table from CLI. This post is about doing it from CLI.

So, to copy everything, including database objects such as indexes, primary key constraint, foreign key constraints, triggers, etc., run these queries:

CREATE TABLE new_table LIKE old_table; // copies table structure and indices
 
INSERT new_table SELECT * FROM old_table; // copies data into new_table

https://tableplus.io/blog/2018/11/how-to-duplicate-a-table-in-mysql.html

Render Template without a custom Controller – Symfony

In any MVC framework when you want to show any page you would normally create a controller and render template from within the controller.

Laravel Framework

class BooksController extends Controller
{
    /**
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function index()
    {
        $books = Book::all();
        return view('books.index', compact('books'));
    }
}

Symfony Framework

class BooksController extends AbstractController {

	/**
	 * @Route("/")
	 *
	 * @return Response
	 */
	public function index() {
             $books = $this->getDoctrine()->getRepository(Books::class);
             return $this->render("books/index.html.twig", [
			'books' => $liveAlarms,
			]
		);
       }
}

But in Symfony, if you are rendering a simple template, for instance, static content which doesn’t need any data from Controller you can still render it without creating a Controller by using built-in TemplateController.

# config/routes.yaml
acme_privacy:
    path:         /privacy
    controller:   Symfony\Bundle\FrameworkBundle\Controller\TemplateController
    defaults:
        template: static/privacy.html.twig
    methods: GET

Check if script is running in CLI

There may be number of occasions when you want to check if the script is running on Command Line Interface (CLI) or the browser an you may have come across various solutions that work on one occasion but not other.

I have come across one solution that would consider various factors to decide if it is running on CLI.

function is_cli()
{
    if ( defined('STDIN') )
    {
        return true;
    }

    if ( php_sapi_name() === 'cli' )
    {
        return true;
    }

    if ( array_key_exists('SHELL', $_ENV) ) {
        return true;
    }

    if ( empty($_SERVER['REMOTE_ADDR']) and !isset($_SERVER['HTTP_USER_AGENT']) and count($_SERVER['argv']) > 0) 
    {
        return true;
    } 

    if ( !array_key_exists('REQUEST_METHOD', $_SERVER) )
    {
        return true;
    }

    return false;
}

Virtualmin

Virtualmin is one of the popular opensource freely available cloud computing control panels for Web Hosting.

Virtualmin-Dashboard
Virtualmin-Dashboard

I have been looking for various control panels to host some websites I deal with on daily basis and I came across handful of some interesting control panels such as Plesk, CPanel etc to name a few. These are not free though, costing at least £9.16/month and $20/month respectively at the time of writing this post.

Recommended System Specifications

  • Automated installation requires a freshly installed, supported OS.
  • 1 GB RAM (less for the –minimal installation), more is better
  • 1 GB free disk space, more for your domain data

Mainden Post

Hello – welcome to my blog. Yes, this is the first post of the blog since the new site was setup. But don’t worry I will be posting new stuff soon on here. So keep looking at this space for some exciting stuff.

As you may already be aware that I am an experienced developer and currently working at Virgin Media. I have working with some interesting technology stack previously and therefore, I will be writing about them here in my blog.

State of the art technology stack is the key to any business’s success and being a developer my first priority is to keep myself updated about the latest trends in the market and implement them where appropriate. I am sure you will learn something as I keep writing about my experiences.

So stay tuned until then and I will be back with some brand new post soon.