#Симптомы, область применения и причины
После переноса PHP-проекта с Windows на Linux автозагрузка не находит класс из-за разницы между именем PHP-файла, пространством имён и путём автозагрузчика Composer. В Linux имена UserService.php и userservice.php обычно различаются, поэтому проект, работавший на файловой системе без учёта регистра, может ломаться только после переноса на сервер.
| Возможная причина | Как узнать | Что делать |
|---|---|---|
Регистр символов пути не совпадаетВ src/Service/UserService.php и ожидаемом пути автозагрузчика используются разные заглавные буквы. | На Windows работает, а на Linux возникает Class ... not found. | Сопоставить полный путь в автозагрузчике PSR-4 и точное имя файла. |
| Неверное пространство имён или сопоставление PSR-4Класс указан в одном namespace, а файл находится в другом каталоге. | Ошибка сохраняется и при правильном регистре basename. | Проверить namespace, use и раздел autoload composer.json. |
| Автозагрузчик/кеш использует старую картуПосле смены имени файла Composer ещё хранит прежний путь. | Переименование уже выполнено, но Class not found сохраняется только в развёрнутой сборке. | Выполнить штатное обновление карты загрузки на стороне проекта. |
#Безопасная диагностика и пошаговое исправление
- Запишите имя отсутствующего класса целикомВ панели сайта откройте журнал PHP и найдите исходное сообщение
Class "Vendor\Package\Name" not foundили ошибкуrequireс указанным путём. Скопируйте полное пространство имён вместе с регистром букв, а также время и исходный обработчик запроса. Не скачивайте библиотеку с неизвестного сайта: её файл может уже существовать под другим именем.
- Найдите файл и сравните каждую буквуОткройте файловый менеджер панели или редактор проекта на сервере, перейдите от корня проекта к каталогу
src/appпо структуре вашего приложения. Найдите файл класса и проверьте совпадение прописных/строчных букв имени, каталогов и расширения.php. Например, запросApp\Service\MailSenderпри PSR-4App\→src/предполагает файлsrc/Service/MailSender.php. Linux сравнивает регистр имени каждого каталога, а не только файла.
- Сопоставьте namespace в самом файлеОткройте найденный PHP-файл и прочитайте строку
namespaceи объявлениеclass. Для примераnamespace App\Service; class MailSenderдолжно соответствовать вызовуApp\Service\MailSenderи сопоставлению PSR-4. Не переименовывайте сам класс без поиска всех его обращений; сначала исправьте точную ошибку пути и сохраните копию. - Пример кода по темеPHPУчебный пример расположения класса в
src/Service/MailSender.php, если в Composer задано PSR-4App\→src/.<?php namespace App\Service; final class MailSender {}
- Проверьте Composer-конфигурациюВ корне проекта откройте
composer.json, найдитеautoload→psr-4; сопоставьте префикс, путь к каталогу и регистр. Если проекта без Composer, найдите свойspl_autoload_registerи посмотрите фактические правила построения имени файла. Убедитесь, что на веб-сервере установлены те же исходники, что и у разработчика; перед правками создайте резервную копию файла и сохраните текущую версию проекта.
- Исправьте путь с учётом контроля версийПереименуйте файл и каталоги так, чтобы они точно соответствовали классу и PSR-4. Если разработка ведётся на Windows и Git не замечает смену только регистра, выполните временное переименование в другое имя и затем в нужное с фиксацией изменений в Git; не переименовывайте массу файлов автоматически. В Linux убедитесь, что новый путь находится в той же точке, которую ожидает автозагрузчик.
- Обновите карту автозагрузки штатноЕсли проект использует Composer, из терминала в корне проекта (там, где
composer.json) выполнитеcomposer dump-autoload -o, предварительно убедившись, что Composer установлен и в сборке нет несогласованных изменений. Ключ-oсоздаёт оптимизированную карту классов; команда не ставит новые пакеты и не заменяетcomposer.lock. На сервере с управляемым выпуском лучше обновить карту во время сборки, а не вручную в рабочем каталоге.Linux · Терминал (Bash)КомандаВ корневом каталоге PHP-проекта, в среде с установленным Composer. Обычных прав владельца проекта достаточно.composer dump-autoload -o
- Очистите только соответствующий кеш приложения при необходимостиЕсли Composer пересобран, но всё ещё загружается прежний путь, проверьте механизм кеша фреймворка и Opcache. Перезапуск пула PHP-FPM допустим только после проверки состояния и в плановом окне, если именно Opcache сохраняет старый код; не отключайте Opcache для всех сайтов. Если сообщение изменилось на ошибку метода или зависимостей, это уже другая неисправность.
- Проверьте исправленный путь и выполните откат при неуспехеВ тестовой среде загрузите страницу, которая ранее приводила к Class not found; сравните журнал и загрузку класса. Затем убедитесь, что другие маршруты сайта работают. Если ошибка остаётся, верните исходный файл из копии, восстановите карту Composer предыдущего выпуска и передайте разработчику имя класса, путь, PSR-4-префикс и точный текст ошибки.
#Как проверить результат и что делать дальше
Показатель успеха — нужный класс подгружается на Linux без обходов и не возникает новых ошибок автозагрузки на соседних маршрутах. Если проблема воспроизводится, сравните содержимое файлов и регистрацию классов, не применяйте глобальное переименование путей или ослабление прав каталогов.