Подробное руководство по запуску PHP скриптов
Способы запуска PHP скрипта
Основной и наиболее простой способ для разработки - использование встроенного веб-сервера PHP. Он не требует установки Apache или Nginx и запускается командой:
php -S localhost:8000Php запуск скрипта (запуск php-скрипта)
После этого все файлы в текущей директории становятся доступны по адресу http://localhost:8000. Например, создав файл index.php с кодом:
<?php echo "Hello, World!";Можно открыть браузер и увидеть результат. Этот способ удобен для локальной разработки и тестирования. Однако он не подходит для production из-за однопоточности.
Типичная ошибка: порт 8000 уже занят. Решение: указать другой порт, например php -S localhost:8080. Также возможна проблема с маршрутизацией - если используется фронт-контроллер, необходимо указать скрипт маршрутизации: php -S localhost:8000 public/index.php.
Как запустить PHP скрипт из командной строки?
CLI позволяет выполнять PHP скрипты без веб-сервера. Это полезно для автоматизации, обработки данных, консольных инструментов.
php script.phpЕсли скрипт требует аргументы, их можно передать через пробел: php script.php arg1 arg2. Внутри скрипта аргументы доступны через $argv и $argc.
Ошибка: команда php не найдена. Решение: добавить путь к PHP в PATH или указать полный путь, например /usr/bin/php script.php. Возможен конфликт версий - используйте php8.1 script.php.
Как выполнить PHP скрипт через Apache с mod_php?
Apache с mod_php обрабатывает .php файлы как CGI. Достаточно поместить файл в DocumentRoot. Скрипт выполняется при обращении по URL.
# /var/www/html/index.php
<?php phpinfo(); ?>Установка: Ubuntu sudo apt install libapache2-mod-php, затем sudo a2enmod php и перезапуск Apache.
Ошибка 404: файл не найден. Проверьте пути. Если скрипт выводится как текст, mod_php не активирован. Выполните установку и перезапустите Apache.
Как запустить PHP с Nginx и PHP-FPM?
Nginx перенаправляет запросы на .php файлы сокету PHP-FPM. Настройка в файле конфигурации Nginx.
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}Перезапуск: sudo systemctl restart nginx php8.1-fpm.
Ошибка 502: PHP-FPM не запущен. Проверьте статус sudo systemctl status php8.1-fpm. Убедитесь в существовании сокета или используйте порт 9000.
Как запустить PHP скрипт по расписанию через cron?
Cron выполняет скрипты в заданное время. Добавьте задачу в crontab.
0 * * * * /usr/bin/php /home/user/script.phpВажно указывать полные пути. Перенаправление вывода: > /home/user/log.txt 2>&1.
Скрипт не выполняется: неверный путь, относительные пути. Решение: внутри скрипта использовать chdir(__DIR__) или абсолютные пути.
Как запустить PHP скрипт из другого скрипта через exec?
Функции exec(), shell_exec(), system() позволяют выполнять системные команды.
<?php
$output = shell_exec('php /path/to/script.php --option value');
echo $output;
?>Для асинхронного запуска добавьте > /dev/null 2>&1 &.
Опасность инъекций: экранируйте аргументы через escapeshellarg(). Выполнение может быть заблокировано disable_functions.
Как запустить PHP скрипт в Docker контейнере?
Docker обеспечивает изолированное окружение. Используйте образ с Apache или PHP-FPM.
FROM php:8.1-apache
COPY . /var/www/html/
EXPOSE 80Сборка и запуск: docker build -t my-app . && docker run -p 8080:80 my-app.
Порт занят: измените маппинг. Код не обновляется: используйте volumes. Проблемы с правами: укажите пользователя www-data.
Как запустить PHP в интерактивном режиме (php -a)?
Интерактивная оболочка PHP позволяет выполнять код построчно, что удобно для быстрого тестирования.
php -a
php > echo "hello";
hello
php >Выход из режима: exit или Ctrl+D.
Интерактивный режим может не поддерживать некоторые расширения. Также он не подходит для запуска целых скриптов.
Расширенные примеры запуска PHP скриптов
Пример 1: Встроенный сервер с кастомным маршрутизатором. Создайте файл router.php:
<?php
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if ($path === '/') {
echo 'Home page';
} else {
return false; // default static file serving
}
?>Запустите сервер с указанием маршрутизатора: php -S localhost:8000 router.php. Откройте http://localhost:8000 - увидите "Home page". Для других путей сервер будет искать файлы.
Home page
Пример 2: Выполнение скрипта с аргументами и захват вывода через proc_open для большего контроля.
<?php
$descriptorspec = array(
0 => array("pipe", "r"), // stdin
1 => array("pipe", "w"), // stdout
2 => array("pipe", "w") // stderr
);
$process = proc_open('php worker.php --name=Alex', $descriptorspec, $pipes);
if (is_resource($process)) {
fclose($pipes[0]);
$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);
$return_value = proc_close($process);
echo "stdout: $stdout\n";
echo "stderr: $stderr\n";
}
?>Этот подход позволяет читать stderr и код возврата. Пример вывода: stdout: Hello, Alex! (stderr пуст).
stdout: Hello, Alex! stderr:
Пример 3: Запуск PHP-FPM вручную с нестандартной конфигурацией.
php-fpm8.1 --fpm-config /etc/php/8.1/fpm/php-fpm.conf --nodaemonizeЭтот режим запускает FPM на переднем плане, удобно для отладки. Ошибки конфигурации выводятся в консоль.
Пример 4: Выполнение PHP кода прямо в командной строке с флагом -r (run).
php -r "echo 'Current time: ' . date('H:i:s');"Current time: 14:35:22
Полезно для быстрых вычислений. Не требует создания файла.
Пример 5: Запуск нескольких скриптов параллельно с использованием pcntl_fork (только Unix).
<?php
$pid = pcntl_fork();
if ($pid == -1) {
die('Could not fork');
} else if ($pid) {
// Parent
pcntl_wait($status);
} else {
// Child
exec('php another_script.php');
exit;
}
?>При таком подходе родительский процесс ждет завершения дочернего. Для параллельного выполнения нескольких задач создается несколько форков.
Пример 6: Использование systemd timer для запуска PHP скрипта (аналог cron на современных системах).
[Unit]
Description=My PHP task
[Service]
ExecStart=/usr/bin/php /opt/scripts/task.php
Type=oneshot
[Timer]
OnCalendar=daily
[Install]
WantedBy=timers.targetПоместите файл в /etc/systemd/system/my-task.service и my-task.timer, затем активируйте таймер: sudo systemctl enable --now my-task.timer. Преимущество в более гибком управлении по сравнению с cron.