За последние 24 часа нас посетили 10044 программиста и 1140 роботов. Сейчас ищут 412 программистов ...

долгое выполнение CLI скрипта

Тема в разделе "Версионность, тестирование и развёртывание", создана пользователем Taktreba, 21 июл 2021.

  1. Taktreba

    Taktreba Активный пользователь

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    есть docker-compose.yml, с него разворачиваю проект

    Код (Text):
    1. version: '3'
    2.  
    3. services:
    4.   apps:
    5.     image: my/php-image
    6.     expose:
    7.       - "9000"
    8.     ports:
    9.       - 80:80
    10.     volumes:
    11.       - ./sites/:/var/sites
    12.     extra_hosts:
    13.       - "api.site.local:127.0.0.1"
    14.       - "storeapi.site.local:127.0.0.1"
    15.       - "integration.site.local:127.0.0.1"
    16.     environment:
    17.       XDEBUG_CONFIG: "remote_host=site remote_enable=2 remote_autostart=on  remote_port=9000"
    18.       PHP_IDE_CONFIG: "serverName=site"
    19.       SANDBOX: 0
    20.       DEVELOPER: "TRUE"
    21.       DEBUG: "TRUE"
    22.   db:
    23.     image: mysql
    24.     command: --default-authentication-plugin=mysql_native_password
    25.     ports:
    26.       - 3306:3306
    27.     environment:
    28.       MYSQL_ROOT_PASSWORD: root
    29.  
    30.   adminer:
    31.     image: adminer
    32.     restart: always
    33.     ports:
    34.       - 8080:8080


    все поднимаю все хорошо. Дальше
    Есть файл cli.php где запускаються задачи, задачи отрабатываються нормально.
    НО!
    сам cli.php файл начинает работать не сразу, проходит секунд 15 и только потом запускается скрипт.
    Сам проект работает быстро в браузере.

    ВОПРОС: на что докер (контейнер) тратит время перед запуском cli.php файла. Вообще не понимаю в какую сторону копать. Давайте вместе найдем проблему ) заранее спасибо
     
    #1 Taktreba, 21 июл 2021
    Последнее редактирование модератором: 21 сен 2021
    Алекс8 нравится это.
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.752
    Симпатии:
    1.150
    Адрес:
    там-сям
    Предположу что задержка из-за сетевых проблем. Типа, xdebug всегда активен и на старте скрипта он пытается соединиться с удаленным хостом.
     
  3. Taktreba

    Taktreba Активный пользователь

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    xdebug отключил. Не помогло.
    Кстати не первый раз разворачиваю этот докер, но первый раз встречаю такую проблему

    Какие еще могут быть варианты?
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.752
    Симпатии:
    1.150
    Адрес:
    там-сям
    Как вообще запускаешь этот скрипт?

    Тормозит любой скрипт, даже пустой?

    Если нет, то выясни на каком месте задержка. Отлаживай.
     
  5. Taktreba

    Taktreba Активный пользователь

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    в корне проекта создаю новый файл рнр, пустой, открываю скобки, ставлю die, и он все равно секунд 15 запускается
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.752
    Симпатии:
    1.150
    Адрес:
    там-сям
    Как запускаешь?
    --- Добавлено ---
    15 сек это просто
    Код (Text):
    1. $ php path/to/script.php
    Или там ещё какие-то пляски?
    --- Добавлено ---
    Еще сделай php -m чтобы посмотреть какие модули подключены, правда ли ты убрал xdebug.
     
  7. Taktreba

    Taktreba Активный пользователь

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    [PHP Modules]
    Core
    ctype
    curl
    date
    dom
    fileinfo
    filter
    ftp
    hash
    iconv
    json
    libxml
    mbstring
    mongodb
    mysqlnd
    openssl
    pcre
    PDO
    pdo_dblib
    pdo_mysql
    pdo_sqlite
    pdo_sqlsrv
    phalcon
    Phar
    posix
    readline
    Reflection
    session
    SimpleXML
    soap
    SPL
    sqlite3
    sqlsrv
    standard
    tokenizer
    xdebug
    xml
    xmlreader
    xmlwriter
    zlib

    [Zend Modules]
    Xdebug

    в корне проекта создаю пустой файл и запускаю php aa.php - те же 10-15 секунд
    --- Добавлено ---
    не ужели все подрядд отключать придется ( что бы понять что тормозит?
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.752
    Симпатии:
    1.150
    Адрес:
    там-сям
    Семён Семёныч, ну что же вы!
    Я же просил отключить xdebug. :) Пока моя версия не проверена. Действуй!
    Учтоняю: надо отключить xdebug только для консоли!!! Ты знаешь что модули PHP можно отдельно настраивать для fpm, apache и cli ?

    Скрипт может тормозить потому что php лезет к сети и не находит ответа. А что у нас сразу лезет к сети, даже с путым скриптом, прям на старте? Правильно - xdebug.
    --- Добавлено ---
    Как выглядит типичная структура фс на ubuntu
    Код (Text):
    1.  
    2. etc/
    3.   php/
    4.     7.4/
    5.       cli/
    6.         conf.d/
    7.           ##-xxx.ini
    8.         php.ini
    9.       fpm/
    10.         conf.d/
    11.           ##-xxx.ini
    12.         php.ini
    тебе надо удалить /etc/php/7.4/cli/conf.d/20-xdebug.ini (с поправкой на версию и дистрибутив)
    потом опять проверить php -m чтобы убедиться что там нет xdebug
     
    Taktreba нравится это.
  9. Taktreba

    Taktreba Активный пользователь

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    не ужели все подрядд отк
    php -m я вижу что xdebug и в [PHP Modules] и в [Zend Modules]
    что именно нужно отключить из этого? и смогу ли я работать потом с дебагером дальше? и вообще почему их два ? ))) пока впросов становить только больше ^^
    не, не знаю (
    --- Добавлено ---
    у меня в php.ini вот такой путь указан -
    Configuration File (php.ini) Path /usr/local/etc/php
    и fpm или cli там нету ... (ща буду искать)
    --- Добавлено ---
    find -name xdebug.ini вот так вот ничего не находит в /
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.752
    Симпатии:
    1.150
    Адрес:
    там-сям
    Женя, я не хочу слишком втягиваться в твои задачи. Просто скажу как бы я дейстовал:
    Судя по всему, это не убунта. Точно выяснить можно заглянув в /etc/issue
    Я надеюсь, что конфигурации консольного и веб php все-таки разные. Я предпочитаю оставлять xdebug для веб-версии и отключать для консольной. Потому что не хочу чтобы задачи в кроне или php artisan ххх стучались в мой phpstorm. Для такой консольной отладки у меня есть специальные трюки.

    В консольном php можно узнать путь до настроек так:
    php -i | grep php.ini
    или показать сразу все подключенные файлы
    php --ini
    А дальше надо смотреть: возможно все настройки содержатся в одном php.ini, тогда там надо закоментировать строчки про xdebug. А возможно подключаются файлы для отдельных модулей, тогда надо удалить файл.

    Команду find ты используешь слишком тупо. Надо чуть сложнее:
    find / -name "*xdebug.ini"
    Тогда он найдет и например такой файл: 20-xdebug.ini
     
    Taktreba нравится это.
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.752
    Симпатии:
    1.150
    Адрес:
    там-сям
    наша цель - проверить не он ли создает проблему, а не выключить его навсегда.
    без понятия почему их два. кривой конфиг мб? вот заглянешь в конфигурацию и выяснишь!
     
  12. Taktreba

    Taktreba Активный пользователь

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    Саша, я выяснил несколько вещей.
    Первое то что, все еще я темный лес в настройках environment.
    Второе что fpm нет у апача, и есть у nginxa
    Дальше... я выяснил что если в php.ini закоментировать все что где есть xdebuger, в том числе и ;zend_extension=xdebug.so - моя проблема решается.
    Если написать php -m то я вижу что xdebuger пропадает и из [PHP Modules] и из [Zend Modules]

    Я так понимаю что у меня начинает срабатывать дебагер и при запуске программы из консоли? и получается нуэно сделать то что ты писал выше "оставить дял веб и отключить для консоли..." - как это сделать?
    --- Добавлено ---
    - у меня апач
    - xdebug.ini я не могу найти
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.752
    Симпатии:
    1.150
    Адрес:
    там-сям
    Ну ты и не обязан быть гуру во всём. В интернетах есть миллион готовых образов docker с php. Можешь попробовать найти подходящий.
    Я использую просто официальный образ ubuntu и в нем ставлю php без каких-то финтов, стандартно и вижу разные ini для apache / cli / fpm

    Ты до этого не говорил пр апачи. ))) Вообще-то апачи может работать с php-fpm, но может и традиционно с mod_php, нам это не принципиально. Просто если БЫ были разные папки для апачи и консоли, то было бы удобно. Например в убунте так и там удобно.

    Уже не надо искать xdebug.ini если и без этого получилось выключить xdebug. Значит он настраивается в главном ini файле.

    Как выглядит полный путь к php.ini если ты посмотришь в phpinfo через веб-страничку? А как он же выглядит если через консольный php --ini ? Они разные? Если да, то это ответ на твой вопрос "как сделать" — надо закоментировать xdebug только в консольном варианте php.ini.
    Если одинаковый, то я бы забил х на этот образ докер и нашел более дружественный на базе ubuntu. Я тоже не гуру и не знаю как разделить конфиги cli/web если они не разделены уже.

    На этом всё. Дальше давай сам. Удачи!
     
    Taktreba нравится это.
  14. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.752
    Симпатии:
    1.150
    Адрес:
    там-сям
    @Taktreba мне понадобилось разделить ini в образе на основе Debian 10.
    Код (Text):
    1. $ cat /etc/issue
    2. Debian GNU/Linux 10 \n \l
    3.  
    4. $ php -v
    5. PHP 7.2.34 (cli) (built: Dec 11 2020 10:56:30) ( NTS )
    6. Copyright (c) 1997-2018 The PHP Group
    7. Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    8.  
    9. $ php --ini
    10. Configuration File (php.ini) Path: /usr/local/etc/php
    11. Loaded Configuration File:  /usr/local/etc/php/php.ini
    12. Scan for additional .ini files in: /usr/local/etc/php/conf.d
    13. Additional .ini files parsed:  /usr/local/etc/php/conf.d/docker-php-ext-gd.ini,
    14. /usr/local/etc/php/conf.d/docker-php-ext-gnupg.ini,
    15. /usr/local/etc/php/conf.d/docker-php-ext-imagick.ini,
    16. /usr/local/etc/php/conf.d/docker-php-ext-intl.ini,
    17. /usr/local/etc/php/conf.d/docker-php-ext-mysqli.ini,
    18. /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini,
    19. /usr/local/etc/php/conf.d/docker-php-ext-soap.ini,
    20. /usr/local/etc/php/conf.d/docker-php-ext-sodium.ini,
    21. /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini,
    22. /usr/local/etc/php/conf.d/docker-php-ext-xsl.ini,
    23. /usr/local/etc/php/conf.d/docker-php-ext-zip.ini
    По умолчанию там один php.ini на все случаи. Но я поискал и нашел, что если в папке с php.ini появится файл php-cli.ini, то консольный вариант будет использовать именно его. В итоге у меня такая структура
    Код (Text):
    1. /usr/local/etc/php/
    2.   conf.d/
    3.   php-cli.ini
    4.   php.ini
    содержимое php.ini (используется в веб-версии)
    Код (Text):
    1. max_execution_time = 1000
    2. max_input_time = 1000
    3. ; xdebug 3 installed in docker. I use MacOS on host, PhpStorm listen port 9003
    4. zend_extension=xdebug
    5. xdebug.mode=debug
    6. xdebug.start_with_request=yes
    7. xdebug.client_host=host.docker.internal
    8. xdebug.client_port=9003
    содержимое php-cli.ini (используется в консоли)
    Код (Text):
    1. ;max_execution_time = 1000
    2. ;max_input_time = 1000
    Оба варианта грузят файлы из папки /usr/local/etc/php/conf.d/ поэтому я нашел в ней файл содержащий xdebug и удалил его.

    Теперь если я вызову в консоли php -i | grep xdebug у меня не выведется ничего, т.к. xdebug выключен. Но если я открою в браузере файл с функцией phpinfo(), то я увижу что xdebug включен для web.

    На сладкое, как же всё-таки отлаживать консольные скрипты, когда это понадобится. Для этого я создал алиас с указанием использовать другой ini файл:
    Код (Text):
    1. alias phpdebug='PHP_IDE_CONFIG="serverName=php-docker.local" php -c /usr/local/etc/php/php.ini -d xdebug.start_with_request=yes'
    "php-docker.local" это название сервера в моём PhpStorm. Для него прописан маппинг локальных папок на серверные. И когда мне надо отладить скрипт в консоли, я вызываю его так:
    Код (Text):
    1. $ phpdebug path/to/script.php
     
    don.bidon и Taktreba нравится это.