Практические примеры создания исполняемых файлов PHP

Раздел: Веб-разработка -> Веб-разработка на PHP

Основы создания скриптов PHP

Наиболее универсальный подход для веб-скрипта включает настройку отображения ошибок, безопасный вывод данных и разделение логики. Пример простого, но эффективного скрипта:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

$title = 'Добро пожаловать';
$content = 'Этот скрипт обрабатывает запросы.';
?>
<!DOCTYPE html>
<html>
<head><title><?= htmlspecialchars($title) ?></title></head>
<body>
<h1><?= htmlspecialchars($title) ?></h1>
<p><?= htmlspecialchars($content) ?></p>
</body>
</html>

App path php (работа с путями файлов в php)

Пояснение: error_reporting(E_ALL) и ini_set('display_errors', 1) позволяют видеть все ошибки на этапе разработки. Функция htmlspecialchars защищает от XSS-атак. Проблемы: если сервер блокирует изменение директив через ini_set, ошибки могут не отображаться. Решение: проверить настройки php.ini или использовать файл .htaccess с php_flag display_errors on.

Как передать аргументы PHP-скрипту в консоли?

Скрипты командной строки (CLI) удобны для автоматизации задач. Пример:

#!/usr/bin/php
<?php
echo "Привет, " . ($argv[1] ?? 'мир') . "!\n";
?>

App php domain (работа с доменами в php)

Пояснение: массив $argv содержит переданные аргументы (первый элемент – имя скрипта). Если скрипт запускается без указания php, должна быть строка #!/usr/bin/php и установлены права на выполнение. Проблемы: на Windows shebang не работает; для передачи аргументов через пробел могут возникнуть проблемы с кавычками. Цель: выполнение фоновых задач, обработка логов.

Как запустить PHP-приложение без Apache или Nginx?

Встроенный веб-сервер PHP подходит для локальной разработки. Пример файла маршрутизации router.php:

<?php
$uri = $_SERVER['REQUEST_URI'];
if (preg_match('/\.(?:png|jpg|jpeg|gif|css|js)$/', $uri)) {
    return false; // отдать статический файл напрямую
} else {
    require 'index.php';
}

Http user agent php (получение user-agent в php)

Запуск командой: php -S localhost:8000 router.php. Пояснение: маршрутизатор позволяет обрабатывать все запросы через единый входной файл, а статику отдавать напрямую. Проблемы: сервер не поддерживает .htaccess; для сложных проектов лучше использовать полноценный сервер. Цель: быстрый старт разработки.

Как безопасно принять и обработать данные из HTML-формы?

Обработка форм включает валидацию и защиту вывода. Пример:

<?php
$name = $errors = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name = trim($_POST['name'] ?? '');
    if (mb_strlen($name) < 2) {
        $errors = 'Имя должно содержать не менее 2 символов.';
    } else {
        $name = htmlspecialchars($name);
    }
}
?>
<form method="post">
    <input name="name" value="<?= $name ?>">
    <span style="color:red"><?= $errors ?></span>
    <button>Отправить</button>
</form>

Config app php (конфигурация php приложения)

Пояснение: проверка метода запроса предотвращает обработку GET-данных; mb_strlen учитывает многобайтовые символы. Проблемы: забыли htmlspecialchars при выводе – возможна XSS; валидация только на стороне сервера недостаточна. Цель: сбор контактных данных, регистрация.

Как организовать код с классами и загрузкой зависимостей?

Автозагрузка PSR-4 через Composer упрощает подключение классов. Пример файла composer.json:

{
  "autoload": {
    "psr-4": {"App\\": "src/"}
  },
  "require": {}
}

создание скриптов php (создание скриптов php)

После выполнения composer dump-autoload можно использовать классы в index.php:

<?php
require 'vendor/autoload.php';
use App\Greeter;
$greeter = new Greeter();
echo $greeter->sayHello('Мир');

App php route (маршрутизация в php приложении)

Пояснение: Composer генерирует файл автозагрузки, который подключает классы из указанной директории. Проблемы: несоответствие namespace пути файла приводит к ошибке Class not found. Цель: поддержка объектно-ориентированной архитектуры.

Как выполнить безопасный запрос к MySQL?

Подготовленные выражения PDO предотвращают SQL-инъекции. Пример:

<?php
$dsn = 'mysql:host=localhost;dbname=test;charset=utf8';
$user = 'root';
$pass = '';
try {
    $pdo = new PDO($dsn, $user, $pass);
    $stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
    $stmt->execute([':id' => $_GET['id'] ?? 0]);
    $user = $stmt->fetch(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    die('Ошибка БД: ' . $e->getMessage());
}

Php create html (создание html в php)

Пояснение: prepare и execute с параметрами отделяют данные от запроса. Проблемы: вызов die с сообщением об ошибке выводит потенциально опасные данные пользователю; лучше логировать. Цель: получение данных из таблицы.

Как сохранить данные пользователя между запросами?

Сессии и куки обеспечивают хранение состояния. Пример:

<?php
session_start();
if (!isset($_SESSION['visits'])) {
    $_SESSION['visits'] = 0;
}
$_SESSION['visits']++;
echo "Вы посетили страницу {$_SESSION['visits']} раз(а).";
setcookie('last_visit', date('Y-m-d H:i:s'), time()+3600);

Default php app (настройки по умолчанию в php приложении)

Пояснение: session_start() должен быть вызван до любого вывода. Куки отправляются до вывода содержимого. Проблемы: если забыть вызвать session_start(), данные не сохранятся. Цель: корзина покупок, авторизация.

Как отделить PHP-логику от HTML?

Буферизация вывода и включение шаблонов помогают разделить код и представление. Пример:

<?php
$title = 'Главная';
ob_start();
echo '<p>Привет!</p>';
$content = ob_get_clean();
require 'layout.php';
?>

Php веб сервисы (php веб-сервисы)

Файл layout.php:

<html>
<head><title><?= $title ?></title></head>
<body><?= $content ?></body>
</html>

Пояснение: ob_start() перехватывает вывод, а ob_get_clean() возвращает его в переменную. Проблемы: легко запутаться в области видимости переменных. Цель: упрощение поддержки и дизайна.

- App controller php (создание контроллера в php приложении)
- Php веб страница (веб-страница на php)
- веб приложения php (веб-приложения на php)

Расширенные примеры PHP-скриптов

Простое REST API на чистом PHP

Реализация CRUD-операций через JSON.

Пример
<?php
header('Content-Type: application/json');
$method = $_SERVER['REQUEST_METHOD'];
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$data = json_decode(file_get_contents('php://input'), true);

switch ("$method $uri") {
    case 'GET /api/users':
        echo json_encode(['users' => [1, 2, 3]]);
        break;
    case 'POST /api/users':
        echo json_encode(['created' => $data['name'] ?? 'unknown']);
        break;
    default:
        http_response_code(404);
        echo json_encode(['error' => 'Not Found']);
}
[GET] /api/users → {"users":[1,2,3]}
[POST] /api/users с body {"name":"Alice"} → {"created":"Alice"}
[GET] /api/unknown → {"error":"Not Found"} (код 404)

Пояснение: скрипт определяет HTTP-метод и URI, затем выполняет соответствующее действие. Проблемы: отсутствие валидации входных данных; для продакшена нужна более сложная маршрутизация.

Загрузка файла с проверкой типа и размера

Безопасное сохранение изображений.

Пример
<?php
$allowedTypes = ['image/jpeg', 'image/png'];
$maxSize = 2 * 1024 * 1024; // 2 MB

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
    $file = $_FILES['file'];
    if (!in_array($file['type'], $allowedTypes)) {
        die('Недопустимый тип файла.');
    }
    if ($file['size'] > $maxSize) {
        die('Файл слишком большой.');
    }
    $dest = 'uploads/' . basename($file['name']);
    if (move_uploaded_file($file['tmp_name'], $dest)) {
        echo "Файл сохранён: $dest";
    } else {
        echo 'Ошибка при сохранении.';
    }
}
(загружен файл image.jpg 1MB) → "Файл сохранён: uploads/image.jpg"
(загружен файл script.php) → "Недопустимый тип файла."

Пояснение: $_FILES содержит информацию о загруженном файле. Проверка MIME-типа по $file['type'] ненадёжна – лучше дополнительно проверять расширение или использовать finfo. Проблемы: злоумышленник может подделать MIME-тип; атака переполнения диска. Цель: аватарки, документы.

Создание миниатюры изображения с помощью GD

Уменьшение размеров фотографии.

Пример
<?php
$src = 'photo.jpg';
$thumbWidth = 150;
$thumbHeight = 150;

list($origW, $origH) = getimagesize($src);
$thumb = imagecreatetruecolor($thumbWidth, $thumbHeight);
$source = imagecreatefromjpeg($src);
imagecopyresampled($thumb, $source, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $origW, $origH);
imagejpeg($thumb, 'thumb.jpg', 85);
imagedestroy($thumb);
imagedestroy($source);
echo 'Миниатюра создана.';
(создается файл thumb.jpg размером 150×150)

Пояснение: getimagesize возвращает размеры оригинала. imagecopyresampled выполняет ресемплинг с высоким качеством. Проблемы: расширение GD должно быть установлено; работа с прозрачностью PNG требует дополнительных шагов. Цель: галереи, превью.

Отправка HTTP-запроса через cURL с авторизацией

Получение данных от внешнего API.

Пример
<?php
$ch = curl_init('https://api.example.com/data');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer token123'],
    CURLOPT_TIMEOUT => 10,
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (curl_errno($ch)) {
    echo 'cURL ошибка: ' . curl_error($ch);
} else if ($httpCode !== 200) {
    echo "HTTP код: $httpCode";
} else {
    $data = json_decode($response, true);
    print_r($data);
}
curl_close($ch);
(успешный ответ) → Array ( [id] => 42, [name] => ... )
(ошибка) → "HTTP код: 401"

Пояснение: cURL позволяет настраивать заголовки, таймауты, сертификаты. curl_error улавливает сетевые сбои. Проблемы: если сертификат SSL самоподписан, нужно добавить CURLOPT_SSL_VERIFYPEER => false (небезопасно в продакшене). Цель: интеграция со сторонними сервисами.

Обработка больших файлов с помощью генератора

Чтение CSV построчно без загрузки в память.

Пример
<?php
function readCSV($path) {
    $handle = fopen($path, 'r');
    while (($row = fgetcsv($handle)) !== false) {
        yield $row;
    }
    fclose($handle);
}

foreach (readCSV('data.csv') as $line) {
    echo implode(' | ', $line) . "\n";
}
(строки файла data.csv)
Иван | Петров | 30
Мария | Сидорова | 25

Пояснение: генератор yield возвращает одну строку за раз, экономя память. Проблемы: если файл огромный, скрипт всё равно потребляет время; генератор не подходит для случайного доступа. Цель: импорт данных, логи.

Создание скриптов PHP - comments

En
создание скриптов php (php)