Notatki PHP

prywatne zapiski na kamieniu

Composer to kombajn stosowany przez wygodnych programistów w PHP do obsługi zależności pomiędzy bibliotekami w zadanych projektach. Na czym polega trik? Otóż pracując nad swoim projektem bardzo często wykorzystujemy jakieś biblioteki i komponenty osób trzecich w PHP. Przykładowo - pisząc aplikację korzystającą z jakiegoś komponentu czy biblioteki, nasza aplikacja jest zależna od tego komponentu czy tej właśnie biblioteki, bowiem wymaga jej do poprawnej pracy. Bibliotekę oczywiście możemy na stałe dołączyć do naszego projektu, ale mówią, że jest to rozwiązanie nieeleganckie.

Z pomocą przychodzi właśnie narzędzie - Composer. Wystarczy tylko, że spreparujemy odpowiedni plik z informacją dla aplikacji Composera, w której opiszemy od jakich zewnętrznych bibliotek zależny jest nasz projekt i jakich wymaga do poprawnego działania. Composer następnie podczas instalacji naszej aplikacji odczyta nasz plik z opisem zależności, pobierze je i umieści potrzebne w naszym projekcie. Takie zewnętrzne biblioteki zazwyczaj są pobierane i trafiają w katalogu /vendor.

Jest pewna zaleta takiego rozwiązania - Composer pobierze także drugie zależności dla bibliotek, od jakich zależna jest nasza aplikacja w PHP - bo trzeba zauważyć, że może się zdarzyć, że korzystamy z zewnętrznej biblioteki, która do swojego działania wymaga jeszcze innej zewnętrznej biblioteki. Composer wszystko to  automatycznie uwzględni. W Windowsie możemy to zrobić na dwa sposoby - pobierając instalator exe, który zrobi wszystko za nas, lub manualnie - za pomocą terminala.

Jeśli jednak chcemy to zrobić to automatycznie, to podaję link do instalatora: https://getcomposer.org/Composer-Setup.exe

Manualna instalacja jest ładnie opisana pod adresem: http://phpmajster.blogspot.com/2015/05/phpcomposer-instalacja-i-podstawy.html

Oficjalna strona Composera to: https://getcomposer.org/

Do zainstalowania wymagane jest PHP w wersji co najmniej 5.3.2. 

Proces instalacji automatycznej wymaga wskazania pliku php.exe. Ja wybieram katalog z PHP w wersji 5.6. W przypadku błędów w pliku php.ini, trzeba je poprawić. 

Przykład w działaniu

Potrzebujemy pakiet do tworzenia miniatury obrazka z pliku video mp4.

Znajdujemy projekt do zbadania pod adresem: https://github.com/olaferlandsen/ffmpeg-php-class 

Powiedzmy, że posiadamy pobrany ze strony projektu plik composer.json o postaci

{
    "name": "olaferlandsen/ffmpeg-php-class",
    "description": "FFmpeg class to use with PHP without install FFmpeg-PHP extension",
    "keywords": [
        "ffmpeg",
        "video"
    ],
    "homepage": "https://github.com/olaferlandsen/ffmpeg-php-class",
    "license": "MIT",
    "require": {
        "php": ">=5.3.0",
        "olaferlandsen/ffmpeg-php-class": "^0.1.4"
    },
    "autoload": {
        "psr-0": {
            "FFmpeg": "src/"
        }
    }
}

Początkowa linia zawiera 
"name": "olaferlandsen/ffmpeg-php-class",

gdzie nie podana jest wersja paczki, więc często, gdy instalacja domyślna się nie powiedzie pod Windows na localhost, trzeba ją edytować do postaci z numerem wersji paczki na końcu:


"name": "olaferlandsen/ffmpeg-php-class^0.1.4",

Tworzymy plik kompozytor.bat o następującej postaci jak poniżej, który uruchamiamy. Prawidłowe działanie Composera powinno w wybranym katalogu stworzyć podkatalog /vendor wraz z potrzebnymi komponentami do działania projektu.

 

composer require olaferlandsen/ffmpeg-php-class

pause
@echo off
echo %time%
timeout 15 > NUL
echo %time%

rem *** HACK ALERT: Sleep for 5 seconds ***
ping -n 6 127.0.0.1 > nul
rem ***************************************

 

Chcąc uruchomić pobraną bibliotekę z paczkami pobranymi przez Composer, umieszczamy wywołanie:

// uruchamiamy autoload 
require 'vendor/autoload.php';

które wszystko ładnie połączy.

O tym, czy projekt zadziała, decyduje poprawnie podawana ścieżka, więc czasem można stosować:

require __DIR__ . '/vendor/autoload.php';

Ja często dla testów na localhost pod Windows stosuję "patent" ze ścieżkami i slashami:

$fname = "ffmpeg"; // podkatalog naszego projektu
$pathto = dirname(__FILE__);
echo $pathto; // D:EasyPHP-Devserver-17eds-wwwffmpeg
	$pathto = str_replace($fname, "" ,$pathto);
	$slash = substr($pathto, -1); //ustalamy rodzaj slasha potrzebnego do sciezki do pliku 
	$pathto = substr($pathto, 0, -1); //usuwamy ostatniego slasha
define('FC_MP4_PATH', $pathto);
require FC_MP4_PATH.$slash.$fname.$slash.'vendor'.$slash.'autoload.php';