На сегодняшний день при разработке на PHP совсем не обязательно использовать такую же операционную систему, как и на продакшн сервере.
Т.е. вполне можно работать с версией PHP для Windows, а на рабочем сервере использовать Linux. При этом в большинстве случаев проблем не возникает. Но, тем не менее, перед деплоем желательно протестировать код в условиях максимально приближенных к продакшн среде. И самое простое решение в данной ситуации – использовать VirtualBox.
В большинстве случаев поступают следующим образом:
- Создают виртуальную машину.
- Устанавливают на неё web сервер, базу данных и всё остальное ПО.
- Создают общую папку, в которой находится код приложения. Это позволяет работать с кодом из основной операционной системы, что значительно удобнее.
В результате получаем виртуальную машину, в которой версии программ и конфигурационные файлы полностью совпадают с продакшн сервером. Но разница всё же существует. Гостевая операционная система работает с железом не напрямую, а через VirtualBox, и это создаёт проблему.
В дефолтных настройках Apache по-умолчанию включена директива enablesendfile.
EnableSendfile On
У nginx она по-умолчанию отключена, но если вы переносите конфиги с продакшн среды, то она, скорее всего, будет включена.
Дело в том, что эта директива позволяет ускорить отправку файлов клиенту за счёт того, что при её использовании web серверу не нужно считывать файл перед отправкой. Естественно, операционная система должна поддерживать эту возможность, а при использовании VirtualBox эта функция работает неправильно.
Проявляется это в том, что после изменения статических файлов (например, CSS или JS) сервер отправляет их старые версии. По моим наблюдениям обновление происходит, только если изменяется значительная часть файла.
Вообще проблема известная, и решается отключением директивы sendfile
.
Например, если вы используете Debian 6 и web сервер Apache, добавьте в файл /etc/apache2/httpd.conf
строку
EnableSendfile Off
Для Nginx – в файл /etc/nginx/nginx.conf
http { ... sendfile off; ... }
После изменения конфига не забудьте перезапустить сервер.
Надеюсь, этот пост сэкономит кому-нибудь время 😉