PHP
Co tato dovednost pokrývá
Referenční příručka k vývoji v PHP — od kompetenčního přehledu pro seniorního PHP vývojáře přes kódovací standardy a testování až po frameworky Laravel/Symfony, zabezpečení, ladění výkonu a nasazení pomocí Dockeru.
Kdy ji použít
- Ověření, co má pokrývat role seniorního PHP vývojáře, jako kompetenční checklist
- Aplikace PSR kódovacích standardů nebo strukturování try/catch/finally ošetření chyb
- Psaní PHPUnit unit testů nebo Behat BDD feature souborů pro PHP kódovou základnu
- Návrh nebo revize Laravel controlleru či Symfony controlleru/služby
- Zabezpečení PHP kódu proti SQL injection, XSS nebo CSRF
- Ladění PHP-FPM poolů, OPcache nebo APCu, případně optimalizace databázových dotazů
- Kontejnerizace PHP aplikace pomocí Dockeru a nastavení CI/CD pipeline
Přehled úrovní PHP vývojáře
Seniorní PHP vývojář
Klíčové kompetence:
- PHP runtime, I/O, ošetření chyb, PHP-FPM, garbage collection, optimalizace výkonu
- Frameworky: Symfony, Laravel
- Datové struktury a algoritmy (grafy, stromy, pole, kolekce)
- Autentizace a autorizace: JWT, OAuth
- Nefunkční požadavky (bezpečnost, výkon, škálovatelnost, odolnost)
Vývojářské nástroje:
- IDE: PHPStorm
- DevTools: Postman, DataGrip
Komunikace mezi službami:
- Messaging: RabbitMQ, Pub/Sub, SNS/SQS, Kafka
- REST(ful), WebSocket, RPC/gRPC, HATEOAS
- Vzory výměny zpráv
Cachovací strategie:
- Cache aside, read through, write through
- Politiky nahrazování cache: RR, LIFO, LRU
- Koherence cache
Databázové dovednosti:
- RDBMS: MySQL, PostgreSQL
- NoSQL: MongoDB, Redis, Elasticsearch
- Výkon: ANALYZE, EXPLAIN, VACUUM, Query Planner, pomalé dotazy, indexy
- Normalizace/denormalizace
Bezpečnost:
- SQL injection, CSRF, XSS, CORS
Cloud computing:
- AWS, GCP (VM, kontejnery EKS/ECS, souborové úložiště, cloud funkce, messaging, aplikační nástroje)
Testování a kvalita:
- Testování: akceptační kritéria, verifikace, automatizované testy (unit, integrační, e2e)
- Nástroje kvality: PHPUnit, Behat, PHPSpec
- Quality Gates: SonarQube, nástroje kvality PHP (phpmd, phpcs, phpstan, psalm)
- Code review, monitoring, logování, řízení technického dluhu
Computer science:
- OOP, SOLID, GRASP, DRY, KISS, YAGNI, DDD
- Algoritmy a datové struktury
- GoF vzory, Enterprise Application Patterns, Enterprise Integration Patterns
- Vzory distribuovaných systémů, metodologie 12 Factor
Softwarová architektura:
- Monolit, mikroslužby/SOA, Event Driven, Hexagonal, Event sourcing, CQRS
- Architektonické diagramy: UML, C4, 4+1, Flow, Actors
- Dokumentace API: OpenAPI/Swagger
Kontejnerizace a nasazení:
- Docker, Kubernetes
- CI/CD: GitLab, Jenkins, GitHub Actions
- Branching strategie: git-flow
- Nasazovací strategie: Blue-green, Canary
- Multi-region aplikace
Správa serveru:
- *nix, bash
- Sítě: TCP/IP, UDP, HTTP
- API gateway, SSL terminace, Load Balancing (L4, L7)
- Proxy, Service Mesh
Osvědčené postupy v PHP
Kvalita kódu
PSR standardy:
<?php
// PSR-1: Basic Coding Standard
// PSR-2: Coding Style Guide
// PSR-4: Autoloading Standard
namespace Vendor\Package;
use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface
{
public function sampleMethod($a, $b = null)
{
if ($a === $b) {
bar();
} elseif ($a > $b) {
$foo->bar($arg1);
} else {
BazClass::bar($arg2, $arg3);
}
}
final public static function bar()
{
// method body
}
}
Ošetření chyb
<?php
try {
// Code that may throw an exception
$result = riskyOperation();
} catch (SpecificException $e) {
// Handle specific exception
logError($e->getMessage());
} catch (Exception $e) {
// Handle general exception
logError('General error: ' . $e->getMessage());
} finally {
// Cleanup code that always runs
cleanup();
}
Optimalizace výkonu
Opcode caching:
; php.ini
opcache.enable=1
opcache.memory_consumption=256
opcache.max_accelerated_files=7963
opcache.revalidate_freq=0
Optimalizace databáze:
<?php
// Use prepared statements
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$userId]);
$user = $stmt->fetch();
// Use indexes effectively
// CREATE INDEX idx_users_email ON users(email);
// CREATE INDEX idx_users_status_created ON users(status, created_at);
Testování
PHPUnit
Základní struktura testu:
<?php
use PHPUnit\Framework\TestCase;
class CalculatorTest extends TestCase
{
public function testAddition()
{
$calculator = new Calculator();
$result = $calculator->add(2, 3);
$this->assertEquals(5, $result);
}
public function testDivisionByZero()
{
$this->expectException(\InvalidArgumentException::class);
$calculator = new Calculator();
$calculator->divide(10, 0);
}
}
Behat (BDD)
Feature soubor:
Feature: User login
In order to access my account
As a registered user
I need to be able to log in
Scenario: Successful login
Given I am on the login page
When I enter valid credentials
And I click the login button
Then I should be logged in
And I should see a welcome message
Třída Context:
<?php
use Behat\Behat\Context\Context;
use Behat\Gherkin\Node\PyStringNode;
use Behat\Gherkin\Node\TableNode;
class FeatureContext implements Context
{
/** @Given I am on the login page */
public function iAmOnTheLoginPage()
{
// Implementation
}
/** @When I enter valid credentials */
public function iEnterValidCredentials()
{
// Implementation
}
}
Frameworky
Laravel
Základní struktura aplikace:
app/
├── Console/
├── Exceptions/
├── Http/
│ ├── Controllers/
│ ├── Middleware/
│ └── Requests/
├── Models/
├── Providers/
└── Services/
routes/
├── api.php
├── web.php
└── channels.php
database/
├── migrations/
├── seeders/
└── factories/
Příklad controlleru:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function index()
{
return User::paginate(15);
}
public function store(Request $request)
{
$validated = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|string|min:8',
]);
$user = User::create($validated);
return response()->json($user, 201);
}
public function show(User $user)
{
return $user;
}
public function update(Request $request, User $user)
{
$validated = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users,email,' . $user->id,
]);
$user->update($validated);
return $user;
}
public function destroy(User $user)
{
$user->delete();
return response()->noContent();
}
}
Symfony
Příklad controlleru:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
class ApiController extends AbstractController
{
#[Route('/api/users', name: 'api_users', methods: ['GET'])]
public function getUsers(): JsonResponse
{
// Implementation
return $this->json(['users' => []]);
}
}
Konfigurace služby:
# config/services.yaml
services:
App\Service\UserService:
arguments:
$entityManager: '@doctrine.orm.entity_manager'
Bezpečnost
Běžné zranitelnosti
Prevence SQL injection:
<?php
// Vulnerable (DON'T DO THIS)
$userId = $_GET['id'];
$query = "SELECT * FROM users WHERE id = $userId";
// Safe - Prepared statements
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$userId]);
Prevence XSS:
<?php
// Vulnerable
echo $_GET['name'];
// Safe - Escape output
echo htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');
Ochrana proti CSRF:
<?php
// Generate token
$token = bin2hex(random_bytes(32));
$_SESSION['csrf_token'] = $token;
// In form
<input type="hidden" name="csrf_token" value="<?php echo $token; ?>">
// Verify token
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
die('CSRF token validation failed');
}
Optimalizace výkonu
Konfigurace PHP-FPM
; php-fpm.conf
[www]
user = www-data
group = www-data
listen = /var/run/php/php8.3-fpm.sock
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
Cachovací strategie
OPcache:
opcache.enable=1
opcache.memory_consumption=256
opcache.max_accelerated_files=7963
opcache.revalidate_freq=0
opcache.save_comments=0
Cachování na úrovni aplikace:
<?php
// Using APCu for user cache
apcu_store('user_' . $userId, $userData, 3600);
$userData = apcu_fetch('user_' . $userId);
Nasazení
Docker
Dockerfile:
FROM php:8.3-fpm-alpine
# Install system dependencies
RUN apk add --no-cache \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip
# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Set working directory
WORKDIR /var/www
# Copy application
COPY . .
# Install dependencies
RUN composer install --optimize-autoloader --no-dev
# Set permissions
RUN chown -R www-data:www-data /var/www
# Expose port
EXPOSE 9000
CMD ["php-fpm"]
CI/CD pipeline
Příklad GitLab CI:
stages:
- test
- build
- deploy
test:
stage: test
script:
- composer install
- ./vendor/bin/phpunit
- ./vendor/bin/phpstan analyse
build:
stage: build
script:
- docker build -t myapp:$CI_COMMIT_SHA .
only:
- main
deploy:
stage: deploy
script:
- docker-compose up -d
only:
- main