w3resource

Package installation using composer

Introduction

In the previous tutorial, we looked at what Composer is, and how it helps us to  manage libraries/packages required for our projects. We also talked on installing Composer Locally and Globally.

In this tutorial, we will use composer to install  and manage packages in our project.  This tutorial assumes that you already have a composer running in your PC. If you don’t, please refer to the previous tutorial so that you can follow along.

For simplicity, and clarity, we will be installing a “Monolog”, a data logging library. Monolog helps you log your files, inboxes and some web services. You don’t need to be a master in the use of “Monolog” to follow along, as the process of installing other packages that will be useful in your project is like that of installing monolog.

#Setup:

To install Composer in your project, you need an important file called “composer.json”.  This file is where you define all the dependencies/packages needed in your project. So quickly create a project folder, open it in any editor of your choice and create this file “composer.json”.

#The “require” key:

This is a set of JSON definitions used to tell composer what packages your project will depend on. There may be other variables you may need to define in this composer.json file, but most of the time, this “require” key is often the only content of the composer.json file.

{
“require”:{
“monolog/monolog”:”1.0.*”
}
}

From the above code snippet, we basically created an empty project folder, and created the “composer.json” file inside it. Then inside the composer.json file, goes my “require” key.

We will observe that “require” takes an object, that assigns package names(monolog/monolog) to version constraints (1.1.*).

Composer uses this information to search for the right set of packages in the package repositories registered or in Packagist when there is no repository specified, like in the above example.

#Package Names

The package names consist of a vendor name and a project name. In most cases these names are identical. This naming format plays a vital role in preventing naming conflicts, as two or more persons can have a package with the same name but different vendor name.

#Version Specification

As seen in the above code snippet, we specified, telling Composer to download only the version of monolog in the version range of 1.1.0 and above using the version constraint ”1.0.*”. In this case, the composer will download the latest stable version, within the specified version range.

#Installing Dependencies

We have already told composer the packages to install in our application, now how do we install these packages in our project?

To install these defined dependencies to our project, we must run the composer “install” command from the terminal in our project directory in the as shown in the code snippet below:

composer install

This composer install command will trigger Composer create download the specified version of packages in the “require” key and save them to a default folder ,“vendor” folder. In our case, composer will download monolog and its dependencies into this vendor folder.

Composer will also create an important file called “composer.lock” where it will register all the versions of packages downloaded for our project.

The “composer.lock” file is very important as it ensures that the exact version of packages listed in the composer.lock file is consistent for anyone working on your project.

#Updating Packages

We can also update some of these installed packages in our project to their latest version, but this must be done with care in order to prevent our program from breaking. To update packages, we use the composer update command as shown in the code snippet.

composer update

The above code snippet will update the whole packages, installed in our project. To update only a single package, we need to specify the name of the package to update as shown below.

composer update monolog/monolog

In the above tutorial, we saw how to add composer to our project and how to use it for package management. In the next tutorial, we will take a deeper dive in the exploration of the composer and what it has to offer.

In the main time, don’t forget to like and share this tutorial with your friends, also follow us on social media for more updates.

Previous: Making libraries/packages installable using composer
Next: The concept of composer packages and repositories



PHP: Tips of the Day

How to calculate the difference between two dates using PHP?

Use this for legacy code (PHP < 5.3). For up to date solution see jurka's answer below

You can use strtotime() to convert two dates to unix time and then calculate the number of seconds between them. From this it's rather easy to calculate different time periods.

$date1 = "2007-03-24";
$date2 = "2009-06-26";

$diff = abs(strtotime($date2) - strtotime($date1));

$years = floor($diff / (365*60*60*24));
$months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24));
$days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));

printf("%d years, %d months, %d days\n", $years, $months, $days);

Edit: Obviously the preferred way of doing this is like described by jurka below. My code is generally only recommended if you don't have PHP 5.3 or better.

Several people in the comments have pointed out that the code above is only an approximation. I still believe that for most purposes that's fine, since the usage of a range is more to provide a sense of how much time has passed or remains rather than to provide precision - if you want to do that, just output the date.

Despite all that, I've decided to address the complaints. If you truly need an exact range but haven't got access to PHP 5.3, use the code below (it should work in PHP 4 as well). This is a direct port of the code that PHP uses internally to calculate ranges, with the exception that it doesn't take daylight savings time into account. That means that it's off by an hour at most, but except for that it should be correct.

<?php

/**
 * Calculate differences between two dates with precise semantics. Based on PHPs DateTime::diff()
 * implementation by Derick Rethans. Ported to PHP by Emil H, 2011-05-02. No rights reserved.
 * 
 * See here for original code:
 * http://svn.php.net/viewvc/php/php-src/trunk/ext/date/lib/tm2unixtime.c?revision=302890&view=markup
 * http://svn.php.net/viewvc/php/php-src/trunk/ext/date/lib/interval.c?revision=298973&view=markup
 */

function _date_range_limit($start, $end, $adj, $a, $b, $result)
{
    if ($result[$a] < $start) {
        $result[$b] -= intval(($start - $result[$a] - 1) / $adj) + 1;
        $result[$a] += $adj * intval(($start - $result[$a] - 1) / $adj + 1);
    }

    if ($result[$a] >= $end) {
        $result[$b] += intval($result[$a] / $adj);
        $result[$a] -= $adj * intval($result[$a] / $adj);
    }

    return $result;
}

function _date_range_limit_days($base, $result)
{
    $days_in_month_leap = array(31, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    $days_in_month = array(31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

    _date_range_limit(1, 13, 12, "m", "y", &$base);

    $year = $base["y"];
    $month = $base["m"];

    if (!$result["invert"]) {
        while ($result["d"] < 0) {
            $month--;
            if ($month < 1) {
                $month += 12;
                $year--;
            }

            $leapyear = $year % 400 == 0 || ($year % 100 != 0 && $year % 4 == 0);
            $days = $leapyear ? $days_in_month_leap[$month] : $days_in_month[$month];

            $result["d"] += $days;
            $result["m"]--;
        }
    } else {
        while ($result["d"] < 0) {
            $leapyear = $year % 400 == 0 || ($year % 100 != 0 && $year % 4 == 0);
            $days = $leapyear ? $days_in_month_leap[$month] : $days_in_month[$month];

            $result["d"] += $days;
            $result["m"]--;

            $month++;
            if ($month > 12) {
                $month -= 12;
                $year++;
            }
        }
    }

    return $result;
}

function _date_normalize($base, $result)
{
    $result = _date_range_limit(0, 60, 60, "s", "i", $result);
    $result = _date_range_limit(0, 60, 60, "i", "h", $result);
    $result = _date_range_limit(0, 24, 24, "h", "d", $result);
    $result = _date_range_limit(0, 12, 12, "m", "y", $result);

    $result = _date_range_limit_days(&$base, &$result);

    $result = _date_range_limit(0, 12, 12, "m", "y", $result);

    return $result;
}

/**
 * Accepts two unix timestamps.
 */
function _date_diff($one, $two)
{
    $invert = false;
    if ($one > $two) {
        list($one, $two) = array($two, $one);
        $invert = true;
    }

    $key = array("y", "m", "d", "h", "i", "s");
    $a = array_combine($key, array_map("intval", explode(" ", date("Y m d H i s", $one))));
    $b = array_combine($key, array_map("intval", explode(" ", date("Y m d H i s", $two))));

    $result = array();
    $result["y"] = $b["y"] - $a["y"];
    $result["m"] = $b["m"] - $a["m"];
    $result["d"] = $b["d"] - $a["d"];
    $result["h"] = $b["h"] - $a["h"];
    $result["i"] = $b["i"] - $a["i"];
    $result["s"] = $b["s"] - $a["s"];
    $result["invert"] = $invert ? 1 : 0;
    $result["days"] = intval(abs(($one - $two)/86400));

    if ($invert) {
        _date_normalize(&$a, &$result);
    } else {
        _date_normalize(&$b, &$result);
    }

    return $result;
}

$date = "1986-11-10 19:37:22";

print_r(_date_diff(strtotime($date), time()));
print_r(_date_diff(time(), strtotime($date)));

Ref : https://bit.ly/3gVZuyT