Устранение неполадок

  1. Общее
  2. Пакет не найден
  3. Пакет не найден на travis-ci.org
  4. Пакет, не найденный в Jenkins-build
  5. У меня есть зависимость, которая содержит определение «репозитории» в своем composer.json, но, похоже, это игнорируется.
  6. Я заблокировал зависимость от конкретной фиксации, но получил неожиданные результаты.
  7. Необходимо переопределить версию пакета
  8. Ошибки памяти
  9. Влияние Xdebug на Composer
  10. «Система не может найти указанный путь» (Windows)
  11. Ограничение скорости API и токены OAuth
  12. proc_open (): ошибки форка
  13. Режим деградации
  14. Тайм-аут операции (проблемы IPv6)
  15. Композитор зависает с SSH ControlMaster
  16. Zip-архивы не распаковываются должным образом.

Это список распространенных ошибок при использовании Composer и как их избежать.

Общее #

  1. Прежде чем спрашивать кого-либо, запустите composer diagnose для проверки общих проблем. Если все прошло успешно, переходите к следующим шагам.
  2. При работе с любыми проблемами с помощью Composer обязательно работайте с последней версией. Подробнее см. Самообновление.
  3. Убедитесь, что у вас нет проблем с настройкой, выполнив проверки установщика с помощью curl -sS https://getcomposer.org/installer | php -- --check.
  4. Убедитесь, что вы устанавливаете vendor'ы прямо из вашего composer.json через rm -rf vendor && composer update -v при устранении неполадок, исключая любые возможные помехи существующим установкам поставщиков или записи composer.lock.
  5. Попробуйте очистить кэш Composer, запустив composer clear-cache.

Пакет не найден #

  1. Дважды проверьте, что у вас нет опечаток в ваших папках composer.json или репозиториях и именах тегов.
  2. Обязательно установите правильный minimum-stability. Чтобы начать работу или убедиться, что это не проблема, установите minimum-stability в "dev".
  3. Пакеты, не входящие в Packagist, всегда должны быть определены в корневом пакете (пакет зависит от всех поставщиков).
  4. Используйте один и тот же vendor и имя пакета во всех филиалах и тэгах вашего репозитория, особенно при поддержке сторонней вилки и использовании replace.
  5. Если вы обновляете недавно опубликованную версию пакета, помните, что у Packagist есть задержка до 1 минуты, прежде чем новые компонеты будут видны Composer.
  6. Если вы обновляете один пакет, это может зависеть от более новых версий. В этом случае добавьте аргумент --with-dependencies или добавьте все зависимости, которым необходимо обновить команду.

Пакет не найден на travis-ci.org #

  1. Проверьте элемент «Пакет не найден» выше.
  2. Если тестируемый пакет является зависимостью одной из его зависимостей (циклической зависимости), проблема может заключаться в том, что Composer не может правильно определить версию пакета. Если это git-клон, он, как правило, в порядке, и Composer определит версию текущей ветви, но travis делает мелкие клоны, так что процесс может потерпеть неудачу при тестировании запросов на отрыв и ветвей функций в целом. Лучшим решением является определение версии, с которой вы работаете, через переменную среды COMPOSER_ROOT_VERSION. Например, вы устанавливаете его в dev-master, чтобы определить версию корневого пакета как dev-master. Использование: before_script: COMPOSER_ROOT_VERSION=dev-master composer install для экспорта переменной для вызова композитора.

Пакет, не найденный в Jenkins-build #

  1. Проверьте элемент «Пакет не найден» выше.
  2. Причина сбоя похожа на проблему, которая может возникнуть на travis-ci.org: git-clone / checkout внутри Jenkins оставляет ветку в состоянии «отдельная HEAD». В результате, Composer не может определить версию текущей выделенной ветви и может не решить циклическую зависимость. Чтобы решить эту проблему, вы можете использовать «Дополнительные поведения» -> «Отъезд в конкретную локальную ветвь» в ваших настройках Git для вашего Jenkins-job, где ваш «локальный филиал» должен быть той же веткой, с которой вы проверяете . Используя это, проверка больше не будет находиться в состоянии отсоединения, и циклическая зависимость распознается правильно.

У меня есть зависимость, которая содержит определение «репозитории» в своем composer.json, но, похоже, это игнорируется. #

Свойство конфигурации repositories определяется как [root-only] (../04-schema.md#root-package). Он не наследуется. Вы можете больше узнать о причинах этого в статье «Почему репозиторий загрузок не может быть реконструирован composer'ом?». Самое простое решение этого ограничения - перемещение или дублирование определения repositories в ваш корневой composer.json.

Я заблокировал зависимость от конкретной фиксации, но получил неожиданные результаты. #

Хотя Composer поддерживает блокировку зависимостей для конкретного коммита с использованием синтаксиса #commit-ref, есть определенные предостережения, которые следует учитывать. Наиболее важный из них документирован, но часто упускается из виду:

Примечание. Хотя иногда это удобно, не следует использовать пакеты в долгосрочной перспективе, потому что это связано с техническим ограничением. Метаданные composer.json будут по-прежнему считываться из имени ветви, указанной вами до хеша. Из-за этого в некоторых случаях это не будет практическим решением, и вы всегда должны попытаться переключиться на отмеченные выпуски, как только сможете.

Для этого ограничения просто не обойтись. Поэтому настоятельно рекомендуется не использовать его.

Необходимо переопределить версию пакета #

Допустим, ваш проект зависит от пакета A, который, в свою очередь, зависит от конкретной версии пакета B (скажем, 0,1). Но вам нужна другая версия упомянутого пакета B (скажем, 0.11).

Вы можете исправить это путем псевдонимов версии 0.11 до 0.1:

Composer.json:

{
 "require": {
 "A": "0.2",
 "B": "0.11 as 0.1"
 }
}

См. Псевдонимы для получения дополнительной информации.

Ошибки ограничения памяти #

Иногда композитор может сбой в некоторых командах с этим сообщением:

PHP Fatal error: Allowed memory size of XXXXXX bytes exhausted <...>

В этом случае PHP memory_limit должен быть увеличен.

Примечание. Композитор внутренне увеличивает memory_limit до 1.5G.

Чтобы получить текущее значение memory_limit, запустите:

php -r "echo ini_get('memory_limit').PHP_EOL;"

Попробуйте увеличить лимит в вашем файле php.ini (например, /etc/php5/cli/php.ini для Debian-подобных систем):

; Use -1 for unlimited or define an explicit value like 2G
memory_limit = -1

Или вы можете увеличить лимит с помощью аргумента командной строки:

php -d memory_limit=-1 composer.phar <...>

Эта проблема также может возникнуть в экземплярах cPanel, когда активирована защита корпуса от ракеты-носителя. Для получения дополнительной информации см. Документацию о функции fork bomb на сайте cPanel.

Влияние Xdebug на Composer #

Для повышения производительности при включенном расширении xdebug Composer автоматически перезапускает PHP без него. Вы можете переопределить это поведение, используя переменную среды: COMPOSER_ALLOW_XDEBUG=1.

Composer всегда будет показывать предупреждение, если используется xdebug, но вы можете переопределить его с помощью переменной окружения: COMPOSER_DISABLE_XDEBUG_WARN=1. Если вы видите это предупреждение неожиданно, значит, процесс перезагрузки не выполнен: сообщите об этой проблеме.

"Система не может найти указанный путь" ("The system cannot find the path specified") (Windows) #

  1. Открыть regedit.
  2. Найдите ключ автозапуска внутри HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor, HKEY_CURRENT_USER\Software\Microsoft\Command Processor или HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Command Processor.
  3. Проверьте, содержит ли он какой-либо путь к несуществующему файлу, если это так, просто удалите их.

Ограничение скорости API и токены OAuth #

Из-за ограничений скорости GitHub в их API может случиться, что Composer предложит вам аутентификацию с запросом вашего имени пользователя и пароля, чтобы он мог продолжить работу.

Если вы не хотите предоставлять свои учетные данные GitHub для Composer, вы можете вручную создать токен, используя следующую процедуру:

  1. Создайте токен OAuth в GitHub. Узнайте больше об этом.
  2. Добавьте его в конфигурацию, которая запущена composer config -g github-oauth.github.com

Теперь Composer должен установить / обновить без запроса аутентификации.

proc_open (): fork failed errors #

Если компилятор показывает, что функция proc_open () fork вышла из строя по некоторым командам:

PHP Fatal error: Uncaught exception 'ErrorException' with message 'proc_open(): fork failed - Cannot allocate memory' in phar

Это может происходить из-за нехватки памяти в VPS и отсутствия свободного пространства подкачки.

free -m

total used free shared buffers cached
Mem: 2048 357 1690 0 0 237
-/+ buffers/cache: 119 1928
Swap: 0 0 0

Чтобы включить обмен, вы можете использовать, например:

/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1

Вы можете создать постоянный файл подкачки после этого руководства.

Деградированный режим #

Из-за некоторых неустойчивых проблем в Travis и других системах мы ввели деградированный сетевой режим, который помогает Composer успешно завершиться, но отключает несколько оптимизаций. Это автоматически включается при обнаружении проблемы. Если вы видите эту проблему спорадически, вам, вероятно, не нужно беспокоиться (медленная или перегруженная сеть также может вызывать те тайм-ауты), но если она появляется неоднократно, вы можете посмотреть на варианты ниже, чтобы определить и решить проблему.

Если вы были указаны на этой странице, вы хотите проверить несколько вещей:

  • Если вы используете антивирус ESET, перейдите в «Дополнительные настройки» и отключите «HTTP-сканер» в разделе «Защита веб-доступа»
  • Если вы используете IPv6, попробуйте отключить его. Если это решит ваши проблемы, свяжитесь со своим провайдером или сервером, проблема не в уровне Packagist, а в правилах маршрутизации между вами и Packagist (то есть интернетом в целом). Лучший способ получить эти исправления - повысить осведомленность сетевых инженеров, которые могут исправить это. Взгляните на следующий раздел обходных решений IPv6.
  • Если ничего из перечисленного не помогло, сообщите об ошибке.

Тайм-аут операции (проблемы IPv6) #

Вы можете столкнуться с ошибками, если IPv6 настроен неправильно. Общая ошибка:

The "https://getcomposer.org/version" file could not be downloaded: failed to open stream: Operation timed out

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

Обходной путь Linux:

На linux кажется, что запуск этой команды помогает сделать ipv4-трафик более высоким, чем у ipv6, что является лучшей альтернативой, чем полное отключение ipv6:

sudo sh -c "echo 'precedence ::ffff:0:0/96 100' >> /etc/gai.conf"

Обходные Windows:

На окнах единственный способ - полностью отключить ipv6, боюсь (в окнах или в вашем домашнем маршрутизаторе).

Обходной путь Mac OS X:

Получить имя своего сетевого устройства:

networksetup -listallnetworkservices

Отключить IPv6 на этом устройстве (в данном случае «Wi-Fi»):

networksetup -setv6off Wi-Fi

Запустить композитор ...

Вы можете снова включить IPv6:

networksetup -setv6automatic Wi-Fi

Тем не менее, если это устраняет вашу проблему, обратитесь к своему провайдеру Интернета, чтобы попытаться устранить ошибки маршрутизации. Это лучший способ добиться успеха для всех.

Композитор зависает с SSH ControlMaster #

Когда вы пытаетесь установить пакеты из репозитория Git и используете параметр ControlMaster для вашего SSH-соединения, Composer может просто зависнуть бесконечно, и вы увидите sh процесс в defunct состоянии в вашем списке процессов.

Причиной этого является ошибка SSH: https://bugzilla.mindrot.org/show_bug.cgi?id=1988.

В качестве обходного пути откройте SSH-соединение с вашим узлом Git перед запуском Composer:

ssh -t git@mygitserver.tld composer update

См. Также https://github.com/composer/composer/issues/4180 для получения дополнительной информации.

Zip-архивы не распакованы правильно. #

Composer может распаковать zipballs, используя либо системную утилиту unzip, либо собственный класс ZipArchive PHP. Класс ZipArchive является предпочтительным для Windows. В других операционных системах, где ZIP-файлы могут содержать разрешения и символические ссылки, предпочтительнее использовать утилиту unzip. Рекомендуется установить его, если вам нужны эти функции.