Обновить запись процесса PHP7

PHP

1. Предпосылки

Проект находился в рабочей среде PHP5.6, и было принято решение обновить PHP до PHP7.Основные причины для рассмотрения включают:

1. Официальная версия PHP7 тоже давно выпущена, чего достаточно с точки зрения стабильности и насыщенности данными

2. См. уведомление о том, что PHP5.* не будет выполнять обслуживание безопасности.

3. Улучшена производительность PHP7 по сравнению с PHP5.

4. Жизнь бесконечна, бросая больше, чем

Настоящим записываются процесс и шаги обновления в надежде помочь небольшим партнерам с аналогичными потребностями!

2. Установите PHP7

Я не буду много говорить об этом шаге, найдите процесс установки в Интернете и следуйте инструкциям. (ps: другие коллеги уже установили его на сервер компании, поэтому я могу просто использовать его напрямую)

php7和php5.6具体信息:

# php7 -v
PHP 7.1.12 (cli) (built: Jun  8 2018 19:36:50) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies

# php -v
PHP 5.6.10 (cli) (built: Jun  8 2018 14:46:07) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies

3. В проекте используется среда PHP7

В тестовой среде выполняется много проектов, поэтому вы не можете напрямую заменить php по умолчанию на PHP 7. Используемый метод заключается в использовании конфигурации nginx для обработки и настройке этого проекта на использование phpfpm7.

Вызовите тестовый интерфейс в проекте и протестируйте содержимое интерфейса: echo phpinfo(); Вы можете заметить, что он был заменен на PHP7!

В-четвертых, обнаружение статического кода

Как мы все знаем, PHP7 упразднил многие функции, поэтому нам нужно проверить совместимость кода.

Принятый метод заключается в использовании PHPCS и PHPCompatibility для определения стандарта кодирования PHP7 в проекте.

//PHPCS和PHPCompatibility安装和使用流程
mkdir /tmp/php_codesniffer 
curl -s http://getcomposer.org/installer | php 
./composer.phar config -g repo.packagist composer https://packagist.phpcomposer.com 
./composer.phar selfupdate 
./composer.phar require "squizlabs/php_codesniffer=*" 
cd /tmp/PHPCompatibility 
git clone https://github.com/wimg/PHPCompatibility.git 
/tmp/PHPCompatibility/vendor/bin/phpcs --config-set installed_paths /tmp/PHPCompatibility/PHPCompatibility/ 
/tmp/PHPCompatibility/vendor/bin/phpcs -i 
/tmp/PHPCompatibility/vendor/bin/phpcs --standard=PHPCompatibility --report-file=/tmp/check_php7_report [项目路径] 

После этого код проекта можно обрабатывать поочередно согласно сгенерированному отчету '/tmp/check_php7_report'.

5. Где журнал ошибок?

В проекте используется фреймворк ThinkPHP3.2.2, но пока я не нашел, куда выводится лог ошибок, и продолжу, когда будет время, примерный процесс такой:

1. Сначала добавьте в nginx следующую конфигурацию:error_log logs/error.log error;Затем, после нескольких дней использования, я никогда не видел никаких журналов и думал, что проблем нет.

2. По прихоти я хотел убедиться, что ошибочная ситуация может быть записана, поэтому я написал интерфейс, конкретное содержание:

 $str = 'asdasdaiAAS';
 echo preg_replace("/([A-Z])/e", "'_' . strtolower('\\1')", $str);
 
在Linux下执行PHP脚本输出以下内容,同理接口也应该返回同意内容:
php5.6 : asdasdai_a_a_s
php7   :PHP Warning:  preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in ..

3. Но реальная ситуация, возврат в интерфейсе PHP5.6 соответствует ожидаемому, а в PHP7 возврат пустой и httpcode равен 200 (происходит проблема)

4. Первоначальное предположение состоит в том, что ошибка не записывается из-за фреймворка ThinkPHP, поэтому при проверке его конфигурации и логов фреймворка никаких отклонений не обнаружено.

5. Чтобы продолжить, подождите, пока у вас будет время проверить, где находится журнал ошибок.

6. Обнаружение интерфейса

Изначально я хотел использовать журнал ошибок, чтобы подтвердить, есть ли проблема с интерфейсом, но, поскольку журнал ошибок найти не удалось, у меня не было другого выбора, кроме как перейти на другое решение:

1. Получите вызываемые интерфейсы через журнал nginx, а затем выполните дедупликацию всех интерфейсов проекта, чтобы найти интерфейсы, которые не вызывались.

2. Вызываемый интерфейс использует скрипт для повторного вызова, чтобы получить возвращаемое значение в среде PHP5.6 и PHP7 соответственно, и зашифровать два возвращаемых значения md5 для сравнения.

С этим нетрудно справиться, имея план, и он должен быть последовательным, как и ожидалось, но проблемы действительно есть! (Это также показывает со стороны, что это обнаружение интерфейса очень необходимо и не может быть проверено только тестировщиками)

7. Найденные ямы и способы заполнения ям

1. Проблема: json_encode php7 будет переполняться при обработке типа float

php5.6:[6.28] 
php7:[6.2800000000000002] 

Решение: измените значение serialize_precision в php.ini ниже 17, и самопроверка php7 вернется в нормальное состояние.

2. Проблема: Проблема с переполнением json_encode решается в командной строке, а потом все равно будут проблемы с интерфейсом

Решение: перезапустите phpfpm для PHP7.

3. Проблема: При расчете php7, если делитель равен 0, результатом будет NAN

php5.6:0 
php7:NAN

Решение: оцените случай, когда младший делитель равен 0

8. Заключение

Работа по обновлению PHP7 на этот раз еще не закончена! В настоящее время завершена только часть самопроверки.После прохождения теста работа может быть завершена, когда она полностью подключена к сети!

Если в будущем будут найдены ямы, они будут обновлены здесь вовремя.

Я надеюсь, что дорога впереди может быть великодушной, и на пути не будет ям~