Автозагрузочный код php не обновляется после изменений в среде Lando - PullRequest
0 голосов
/ 03 ноября 2019

Суть проблемы в том, что я редактирую файл кода, и изменения не вступают в силу до тех пор, пока я не восстановлю всю среду. Странно то, что у меня не было этой проблемы в течение многих месяцев разработки до сих пор. Я просто решил стереть этот проект и поработать над ним на этой неделе, и внезапное редактирование файлов больше не работает (без перестройки).

Я даже не знаю, гденачать пытаться решить это. Любой совет помогает, особенно от людей, которые имеют опыт работы с Ландо и Докером. Хорошо, так как я не имею ни малейшего представления, что является причиной этого, я просто попытаюсь объяснить всю мою установку и перейти оттуда:

Я использую Lando для запуска контейнера, который работает на PHP7.3. Когда я запускаю SSH в работающий контейнер и выполняю свой скрипт php worker.php, мой скрипт запускается без проблем. Затем, если я отредактирую его, скажем, добавив var_dump ('hello world!'), Я получу ожидаемый результат. Однако, если я отредактирую автоматически загруженный файл класса, скажем, MyClass.php, и добавлю туда var_dump, ничего не произойдет. Фактически мне нужно полностью перестроить среду с помощью lando rebuild, чтобы показать var_dump. Странно, правда?

Хорошо, вот несколько вещей, которые я пробовал:

  • Я попытался перезапустить Docker.
  • Я попытался перезагрузить свой компьютер.
  • Я пробовал lando destroy и lando rebuild, чтобы начать все сначала.
  • Я пробовал SSHing в контейнер и запускаю cat mylib/MyClass.php, и я вижу добавленный оператор var_dump !! Однако, когда я запускаю php worker.php, var_dump, добавленный в MyClass, там нет. Как это может присутствовать в файловой системе, но отсутствует во время выполнения? Это действительно приводит меня к циклу.
  • Я попытался переименовать MyClass.php в MyClass2.php, и это решает проблему ОДИН РАЗ. Т.е. после его обновления мне нужно переименовывать его снова и снова каждый раз, когда происходит изменение. Это, очевидно, не реальное решение, но это пища для размышлений.
  • Я пробовал вручную загружать классы, используя include_once. Это работает отлично, изменения вступают в силу, как только они происходят. Проблема в том, что я не хочу вручную включать все мои файлы, я хочу использовать автозагрузчик композитора. Я использовал это в течение долгого времени, я предпочел бы просто исправить все, что вдруг с ним случилось.

Хорошо, наконец, некоторые мои теории:

  • Что-то явно кеширует, но я понятия не имею, что. Я подумал, что это может быть связано с кэшированием кода операции PHP, но, насколько мне известно, кэширование кода операции php не включено.
  • Другая теория заключается в том, что, возможно, монтирование файловой системы не работает. Это работает, однако, потому что, когда я редактирую worker.php, изменения мгновенно появляются каждый раз. Этого бы не произошло, если бы не было монтирования файловой системы.
  • Еще одна теория состоит в том, что либо Docker как-то кеширует (я понятия не имею, как), либо, может быть, Ландо? Я не знаю Ландо внутри и снаружи. Возможно, у него есть какая-то схема кэширования, о которой я не знаю.
  • Последняя теория состоит в том, что каким-то образом автоматически загружаемые классы кэшируются самим PHP или моим композитором или что-то в этом роде. Я также не знаю, как это возможно, но я не эксперт по внутренней работе composer или php, поэтому, если где-то здесь есть кэш кода, я не знаю об этом.

Так что некоторые вещи, о которых я знаю, могут спрашивать люди: Dockerfile

FROM php:7.3-apache

RUN apt-get update \
    && apt-get install -y \
       git \
       zip \
       unzip \
       libzip-dev \
       libxml2-dev \
       libssl-dev \
       libc-client-dev \
       libkrb5-dev \
    && docker-php-ext-configure imap --with-kerberos --with-imap-ssl \
    && CFLAGS="-I/usr/src/php" docker-php-ext-install zip mysqli pdo pdo_mysql xmlreader imap

RUN curl --silent --show-error https://getcomposer.org/installer | php
RUN mv composer.phar /usr/local/bin/composer

# Bake composer dependencies into the image for production
WORKDIR /app

COPY composer.json ./
COPY composer.lock ./

RUN export COMPOSER_ALLOW_SUPERUSER=1 && \
    composer install --no-scripts --no-autoloader --no-dev

COPY . ./

RUN export COMPOSER_ALLOW_SUPERUSER=1 && \
    composer dump-autoload --optimize && \
    composer run-script post-install-cmd

COPY vhost.conf /etc/apache2/sites-available/000-default.conf

RUN chown -R www-data:www-data ./ && \
    a2enmod rewrite

EXPOSE 80

.lando.yml

name: mysite
env_file:
  - .env
proxy:
  appserver:
    - mysite.lndo.site
  database:
    - db.mysite.lndo.site
services:
  appserver:
    type: compose
    services:
      build: .
      command: apache2-foreground
  database:
    type: mysql
    portforward: 3306
    creds:
      ---super secret---

composer.json

{
    "name": "MySite/MySite",
    "description": "Would work great if not for caching issues. :(",
    "type": "project",
    "require": {
        "ext-json": "*",
        "ext-imap": "*",
        "doctrine/orm": "^2.6.2",
        "doctrine/migrations": "^2.0",
        "zbateson/mail-mime-parser": "^1.1",
        "rct567/dom-query": "^0.7.0",
        "sabre/xml": "^2.1",
        "phpmailer/phpmailer": "^6.0"
    },
    "autoload": {
        "psr-4": {
            "MySite\\": "./lib"
        }
    }
}

Обновление: я обнаружил, что, удалив vendor/symfony/console и затем запустив composer install, он, кажется, очищает кеш. Я хотел бы понять это отсюда, но ответ все еще ускользает от меня. Как консоль Symfony имеет отношение к кешированию автозагрузки? Понятия не имею.

1 Ответ

0 голосов
/ 03 ноября 2019

Я наконец понял это, но это заняло у меня весь день. Я надеюсь, что кто-то наткнется на это, и это сэкономит ваше время. Вот что я должен был сделать, это было так просто:

Просто поместите следующий код в файл composer.json и запустите composer install!

    "config": {
        "optimize-autoloader": true
    },

Я не знаюПОЧЕМУ это работает, хотя. Я бы предположил, что включение оптимизатора вызовет кеширование, но вместо этого, кажется, отключит его. Я, честно говоря, понятия не имею, почему это работает. Если бы кто-то еще мог объяснить это лучше меня, я бы проголосовал за ваш ответ за мой.

...