Рубрики
Uncategorized

Фреймворк Thinkphpp5 представляет go AOP, Детали проекта программирования PHP ASP

Автор оригинала: David Wong.

В этой статье описывается thinkphp платформа p5 представляет программирование go ASP и PHP ASP . Для вашей справки приведем следующие сведения:

Предыстория проекта

В настоящее время разработанное веб-программное обеспечение обладает этой функцией. PHP обращается к API для управления хранилищем данных. Во-первых, хранилище данных невелико, и никаких проблем не обнаружено. С увеличением количества данных время вызова API часто истекает (60 секунд). Поэтому мы решили использовать асинхронный запрос. Если мы сможем вернуть данные в 60-е годы, мы вернем их. Если нет, мы вернем асинхронный идентификатор. затем мы проведем опрос, выполнено ли статистическое задание. Из – за плотного проекта и нехватки рабочей силы текущие проблемы должны быть решены с минимальными затратами.

Выбор схемы

  1. Повторно проанализируйте требования и улучшите код
  2. Использование AOP для изменения программы

Исходя из анализа новых требований, детального проектирования и изменений кода, нам нужна поддержка продукта, архитектуры, интерфейсного и серверного компонентов. Слишком много людей будут мешать. Это не рекомендуется в случае нехватки ресурсов. С помощью OP большинство задач может быть выполнено серверной частью без изменения логики исходного кода. Серверная часть использует AOP для отключения API запроса и определяет, следует ли разрешить API продолжать выполнять исходную логику (API возвращает данные за 60 секунд) или ввести функцию автономной задачи (API сообщает, что статистическая задача не может быть выполнена в течение 60 секунд).

Я использовал его раньше AOP-PHP Разработка, ее очень просто начать, но позже в большом проекте после внедрения расширения, прямо взорвалась из памяти Затем мы изучаем исходный код и обнаруживаем, что он изменяет синтаксическое дерево и подключает каждый вызываемый метод, то есть каждый вызываемый метод будет запрашиваться AOP-PHP Для этого метода не существует метода сечения. Поэтому потеря эффективности относительно велика. И этот проект не обновлялся уже восемь лет. Поэтому это решение не рекомендуется.

Фактическая окружающая среда

Debian,php-fpm-7.0,ThinkPHP-5.10。

Представляем AOP

Как хороший язык Zui, PHP не поставляется с AOP. Затем вам необходимо установить расширение aop-php. Когда я открываю PECL для загрузки, я веду себя глупо. Все это бета-версия, и нет никаких признаков того, что она поддерживает php 7. Однако мне посчастливилось найти GIT и обнаружить, что он не обновлялся в течение 4-5 лет. Вы хотите дождаться волны обновлений? О, автор сказал в выпуске, что php7 будет совместим, когда у меня будет время. Ладно, мне не нужно много говорить. Следующий план: вперед! ОП. Прочитав его, автор-красивый мужчина в белой футболке, который любит горы. В принципе, на каждый вопрос ответят с энтузиазмом.

composer require goaop/framework

Thinkphpp5 очень хорошо совместим с composer. (в конце концов, я действительно хочу побить автора thinkphpp5) это установлено. Как им пользоваться? Git предлагает простое использование. Я также написал продолжение, чтобы подключиться к контроллеру.

aspectAction();
 }
 
 public function aspectAction()
 {
  return 'hello';
 }
}

Определить аспект

aspectAction(*))")
  */
 public function beforeMethodExecution(MethodInvocation $invocation)
 {
  $obj = $invocation->getThis();
  echo 'Calling Before Interceptor for method: ',
    is_object($obj) ? get_class($obj) : $obj,
    $invocation->getMethod()->isStatic() ? '::' : '->',
    $invocation->getMethod()->getName(),
    '()',
    ' with arguments: ',
    json_encode($invocation->getArguments()),
    "
\n"; } }

Включить аспект

registerAspect(new MonitorAspect());
 }
}

Конфигурация основной службы Go AOP

init([
   'debug' => true,
   'appDir' => __DIR__ . './../../../',
    'cacheDir' => __DIR__ . './../../../runtime/aop_cache',
    'includePaths' => [
     __DIR__ . './../../tests/controller',
     __DIR__ . './../../../thinkphp/library/think/model'
    ],
    'excludePaths' => [
     __DIR__ . './../../aspect',
    ]
   ]);
  return $params;
 }
}

Настройте крючок инициализации модуля для запуска go AOP

 [],
 //Application start
 'app_begin' => [],
 //Module initialization
 'module_init' => [
  'app\tests\behavior\Bootstrap'
 ],
 //The operation begins
 'action_begin' => [],
 //View content filtering
 'view_filter' => [],
 //Log writing
 'log_write' => [],
 //End of application
 'app_end'  => [],
];

Тест на совместимость

Хорошо, заходите http://127.0.0.1/tests/test1/test1 Дисплей:

hello

Это не ожидаемый эффект. После определения аспекта перед доступом к методу будет выведена дополнительная информация о методе. Ожидается следующее

Вызов Перед перехватчиком для метода: приложение\тесты\контроллер\Тест 1->Действие аспекта() с аргументами: []

Зайдите к его официальному доктору, чтобы посмотреть. Это более продвинутый метод. Механизм работы go AOP не упоминается. Я не видел подобной проблемы в GIT. Ну, я обнаружил, что автор часто отвечал в этом вопросе: попробуйте демо. Может быть, мне стоит попробовать демо.

Запуск Демо-версий

Я использую стек технологий SNMP.

  1. Предположим, здесь есть Ubuntu, и вы настроили среду SNMP
  2. Код для загрузки
  3. Настройка nginx
# file: /usr/share/etc/nginx/conf.d/go-aop-test.conf
server {
 listen 8008;
# listen 443 ssl;
 server_name 0.0.0.0;
 root "/usr/share/nginx/html/app/vendor/lisachenko/go-aop-php/demos";
 index index.html index.htm index.php;
 charset utf-8;

 access_log /var/log/nginx/go-aop-access.log;
 error_log /var/log/nginx/go-aop-error.log notice;

 sendfile off;
 client_max_body_size 100m;

 location ~ \.php(.*)$ {
  include       fastcgi_params;
  fastcgi_pass      127.0.0.1:9000;
  fastcgi_index      index.php;

  fastcgi_param      PATH_INFO  $fastcgi_path_info;
#  fastcgi_ param     SCRIPT_ FILENAME /var/www/html/app/vendor/lisachenko/go-aop-php/demos$fastcgi_ script_ Name; configuration of docker
  fastcgi_param      SCRIPT_FILENAME /usr/share/nginx/html/api/vendor/lisachenko/go-aop-php/demos$fastcgi_script_name;
  fastcgi_param      PATH_TRANSLATED $document_root$fastcgi_path_info;
  fastcgi_split_path_info   ((?U).+\.php)(/?.+)$;
 }
}

Затем измените код

  1. посещение http://127.0.0.1 :8008 Попробовать это. (по оценкам, с этим сталкивались все)
  1. Это сообщение об ошибке указывает на то, что этот класс не может быть найден. Пришли не в тот файл. Этот файл использует use, и класс не может быть найден. Проблема с загрузкой поставщик/лисаченко/go-aop-php/демо/autoload.php Настоящий документ.
add('Demo', __DIR__);
}

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

add('Demo', __DIR__);
}

Пробовать снова. Демо-версия запущена.

Попробуйте, запустите успешно

Благодаря приведенным выше выводам можно сделать вывод, что метод успешно захвачен в демо-версии перед запуском. Почему не удается запустить контроллер ThinkPHP. Я решил использовать точки останова для отладки.

Я нашел этот файл через точку останова

original->findFile($class)) {
  $isInternal = false;
  foreach ($this->internalNamespaces as $ns) {
   if (strpos($class, $ns) === 0) {
    $isInternal = true;
    break;
   }
  }

  include ($isInternal ? $file : FilterInjectorTransformer::rewrite($file));
 }
}

Это автоматическая загрузка. Каждый класс будет загружен через него, и будет принято решение о том, является ли он внутренним классом. Если это не так, он войдет в последующую операцию. Введите трансформатор инжектора фильтра через точку останова. Установлено, что синтаксис загруженного файла будет проанализирован, и для связанных классов будет создан прокси-класс в соответствии с зарегистрированной аннотацией. Говоря об этом, вы поймете, как go AOP может внедриться в вашу программу. Созданный прокси – класс можно найти в каталоге кэша (я настроил ./время выполнения/aop_cache/ ) Я вижу это внутри.

В то же время./Время выполнения/AOP_ Многие вещи также генерируются в кэше/папке. Проверьте AOP_ Файл с тем же именем, что и test1, создается в файле кэша. Откройте файл и найдите, что он прокси-сервер исходного контроллера test1. Из этой серии информации можно сделать вывод, что вперед! AOP заставляет каждый класс входить в него, захватывая автоматическую загрузку композитора. В соответствии с определением аспекта, он решает, следует ли создавать для него прокси-класс и внедрять рекомендации. Ну, thinkphpp5 копирует содержимое в автозагрузку composer и помещает их в автозагрузку, и тогда в composer нет ничего плохого. Затем идите, АОП не может дождаться команды от автозапуска композитора. Естественно, это не работает. Так, следующий шаг

Улучшение thinkphpp5

В thinkphpp5 по умолчанию будет зарегистрирован только один внутренний загрузчик TP5, и запрос на включение не будет отправлен в автозагрузку композитора. Поэтому для работы go AOP запрос класса include должен быть передан через aopcomposerload Давайте посмотрим на этот документ

loadClass($class);

    return class_exists($class, false);
   });
   $loader[0] = new AopComposerLoader($loader[0]);
  }
  spl_autoload_unregister($loaderToUnregister);
 }
 unset($loader);

 foreach ($loaders as $loader) {
  spl_autoload_register($loader);
 }
}

В этом файле есть определение типа, чтобы проверить, относится ли обратный вызов автоматической загрузки к типу загрузчика классов. Однако thinkphpp5-это не так. Через точки останова вы обнаружите, что thinkphpp5-это строковый массив. Таким образом, вы не можете зарегистрироваться, чтобы перейти к обратному вызову загрузчика классов.

Здесь мы упомянем механизм автоматической загрузки PHP, который является очень важной функцией современного PHP. Это позволяет нам автоматически загружать файлы по имени, когда мы используем класс. Мы можем автоматически загружать, определяя определенные правила имен классов и каталог файловой структуры, а также функции, которые могут реализовать вышеуказанные правила. Через автоматическую загрузку SPL__ Третий параметр функции регистра добавить Если для него установлено значение true, он будет помещен перед загрузчиком TP5 и будет вызван первым.

В соответствии с вышеуказанным принципом могут быть внесены следующие улучшения. Это новая загрузка, упакованная для приложения go, которая, по сути, добавляет оболочку к оригинальному загрузчику thinkphpp5.

getMethod('findFile');
  $method->setAccessible(true);
  $file = $method->invoke($obj, $class);
  return $file;
 }
}
loadClass($class);

 return class_exists($class, false);
});
$aopLoader = new AopComposerLoader($thinkLoader);
spl_autoload_register([$aopLoader, 'loadClass'], false, true);

return $params;

Здесь мы делаем автопогрузчик и вставляем его непосредственно спереди (если в проекте есть другие автопогрузчики, пожалуйста, обратите внимание на их заказ).

последний

А теперь давайте посетим его еще раз http://127.0.0.1/tests/test1/test1 Вы можете видеть из аспекта Выходную информацию.

Наконец, давайте подведем итоги

  1. PHP7 В настоящее время нет возможности для расширения AOP
  2. ThinkPHP 5 Имеют свои собственные Загрузчик
  3. Иди!AOP Зависимость реализации AOP от Загрузки класса Из обратного вызова , через Заменить исходный файл точка Прокси - класс реализация.
  4. ThinkPHP 5 интеграция Иди!АОП Его нужно отрегулировать автоматическая загрузка

Подробнее о содержании, связанном с ThinkPHP, заинтересованные читатели могут ознакомиться с этой темой сайта: “Учебник по введению в ThinkPHP”, “Краткое изложение навыков работы с шаблонами ThinkPHP”, “Краткое изложение общих методов ThinkPHP”, “Вводный учебник по CodeIgniter”, “Расширенный учебник по фреймворку Ci (CodeIgniter)”, “Учебник по внедрению фреймворка Zend framework” и “Краткое изложение технологии шаблонов PHP”.

Я надеюсь, что эта статья будет полезна для разработки PHP-программы на основе платформы ThinkPHP.

Оригинал: “https://developpaper.com/thinkphpp5-framework-introduces-go-aop-php-aop-programming-project-details/”