Практические примеры создания исполняемых файлов 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() возвращает его в переменную. Проблемы: легко запутаться в области видимости переменных. Цель: упрощение поддержки и дизайна.
Расширенные примеры 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 возвращает одну строку за раз, экономя память. Проблемы: если файл огромный, скрипт всё равно потребляет время; генератор не подходит для случайного доступа. Цель: импорт данных, логи.