Skip to content

Instantly share code, notes, and snippets.

@1234ru

1234ru/nginx-php-win.md

Last active Nov 26, 2020
Embed
What would you like to do?
Установка nginx и PHP на Windows

Установка nginx

  1. Скачиваем отсюда https://nginx.org/ru/download.html и распаковываем куда-нибудь.

  2. Дальше читаем тут https://nginx.org/ru/docs/windows.html ВНИМАНИЕ: команду start nginx обязательно даем прямо из каталога, в котором лежит nginx.exe, в противном случае при дальнейшей работе будут ошибки (все пути в конфигурации прописаны как относительные, только поменяв их все, можно запускать откуда угодно). Вообще рекомендуется держать консоль открытой в этом каталоге до самого конца выполнения инструкций, однако для работы nginx это необязательно - если её закрыть, он продолжит работать.

  3. Открываем http://localhost/ - должно заработать.

Установка PHP

  1. Скачиваем с https://windows.php.net/download (ZIP-архив Non Thread Safe x64), замечаем номер в "VC(число)" - понадобится на следующем шаге. Прописываем каталог в PATH.

  2. Открываем командную строку, запускаем php -v. Должно выскочить окно с надписью "The program can't start because VCRUNTIME140.dll". Если запуск прошел без ошибок, пропускаем следующий пункт.

  3. Ищем на странице загрузки из п.1 в левой колонке ссылку на VC нужного номера. Скачиваем x64.exe, устанавливаем. После этого возвращаемся на предыдущий пункт. На этот раз команда должна показать версию php.

Конфигурация локального сайта в nginx

  1. Выбираем локальное имя хоста (как localhost, только какое-то другое, например, mysite) и каталог, где будут находиться его файлы (например, D:\sites\mysite).

  2. В конец файла (каталог nginx)/nginx.conf перед последней закрывающей скобкой добавляем раздел:

    server {
        listen       80;
        server_name  mysite;
        root D:\sites\mysite;
    }
    
  3. В консоли, находясь в каталоге nginx.exe, даем команду nginx -s reload, чтобы nginx перечитал конфигурацию.

  4. Открываем файл C:\Windows\System32\Drivers\etc\hosts, добавляем строчку

    127.0.0.1	mysite
    

    Файл защищен системой ото всех пользователей, кроме администратора, поэтому перед записью понадобится открыть его свойства и дать там нужные права и потом вернуть, как было.

  5. Открываем в браузере ссылку http://mysite/ (обязательно с http://, иначе браузер станет отправлять в поисковые системы). Должна отобразиться страница 404 от nginx.

Налаживание взаимодействия nginx и PHP

  1. В раздел server конфигурации добавляем такие строки:

    location ~\.php$ {
        fastcgi_pass 127.0.0.1:9123;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
    

    (9123 - номер порта, можно выбрать какой-нибудь другой)

    Из консоли даем команду nginx -s reload.

  2. В консоли переходим в каталог, куда распакован PHP. Даем команду

    php-cgi.exe -b 127.0.0.1:9123
    

    Закрывать окно консоли нельзя, иначе интерпретатор PHP перестанет работать.

    Можно прописать путь к каталогу PHP в системной переменной PATH и запускать его без указания полного пути.

  3. Создаем файл D:\sites\mysite\test.php со следующим содержимым:

    <?php echo "This is PHP script on mysite";
    

    Открываем http://mysite/test.php - текст должен отображаться.

Взаимодействие налажено!

См. также https://www.nginx.com/resources/wiki/start/topics/examples/phpfastcgionwindows/

PHP: ini-файл и модули расширений

Вышеуказанные процедуры позволяют успешно запустить и использовать PHP, однако он будет "голым" - без расширений (в т.ч. таких необходимых, как mysqli, mbstring и др.) и без настроек, т.к. он не прочитает ни одного ini-файла.

PHP может автоматически загрузить файл php.ini из нескольких каталогов. Первое место, где он станет его искать - рядом с php.exe. В пакете есть файл php.ini-development. Нужно создать рядом его копию с именем php.ini, открыть и внести следующие изменения:

  1. Раскомментировать строку extension_dir = "ext" - в результате PHP станет искать модули расширений в подкаталоге ext рядом с php.exe
    (относительный путь интерпретируется именно от exe-, а не от самого ini-файла)

    Проверяем, подключился ли файл, с помощью команды php --ini. Результат должен быть примерно следующим:

    Configuration File (php.ini) Path: C:\Windows
    Loaded Configuration File:         {каталог с дистрибутивом PHP}\php.ini
    Scan for additional .ini files in: (none)
    Additional .ini files parsed:      (none)
    

    Вторая строчка говорит о том, что ini-файл успешно загрузился.

    На первую строчку (про С:\Windows) внимания обращать не следует, т.к. ini-файла по указанном адресу нет.

  2. Найти нужные расширения и раскомментировать строки, где они подключаются. Например, extension=mysqli и т.д.

    Все расширения перечислены рядом, и найти нужные среди них несложно. Рекомендуется включить следующие:

    • curl
    • fileinfo
    • gd2
    • mbstring
    • exif
    • mysqli
    • soap

    Просмотреть список подключенных расширений можно, дав команду php -m. Непустой изначально список после вышеописанной манипуляции пополнится.

PHP загружает расширения при запуске exe-файла интерпретатора. Если нужно подключить новое, следует остановить php-cgi.exe (или php.exe соответственно) и запустить его заново.

PHP и MySQL

Чтобы установить связь между PHP и MySQL, не требуется никаких специальных действий, кроме собственно создания соединения (разумеется, должен быть включен соответствующий модуль, например, mysqli).

Проверить соединение можно так:

echo "Connecting to MySQL server... ";

// $host = 'localhost'; // если соединяемся через named pipe (аналог Unix-сокета),
$host = ".";            // то в качестве хоста указываем "."
$user = "someone";
$password = "a password";
$mysqli = new mysqli($host, $user, $password);

if ($mysqli->connect_error)
	echo $mysqli->connect_error;
else
	echo "Connected successfully!";

Об установке и минимальной настройке MySQL под Windows см. здесь.

Неудобства работы под Windows

  • в путях файловой системы используется обратный слэш (\), а не прямой (/) - типа D:\sites\mysite\... вместо /sites/mysite/..., что влияет, в частности, на содержимое констант __DIR__ и __FILE__;
    как следствие, весь код, рассчитанный на разбор пути по слэшу, перестаёт работать

  • невозможно установить русскую локаль с UTF-8: setlocale(LC_ALL, 'rus') всегда приводит к использованию windows-1251, и изменить это никак не получается

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.