WedX - журнал о программировании и компьютерных науках

Внутреннее повреждение PHAR (несоответствие crc32) во время разветвления процесса

Я разработчик библиотеки ko-worker. Я добавляю функцию с исполняемым файлом phar в качестве приложения-демона. И обнаружил странное поведение с phar и разветвлением процесса undex linux. Каждый раз, когда главный процесс разветвляется более чем на 1 ребенка, я получаю такую ​​​​ошибку

include(phar:///opt/www/worker.phar/vendor/path/to/file.php): 
failed to open stream: phar error: internal corruption of phar    

"/opt/www/worker.phar" (crc32 mismatch on file "vendor/path/to/file.php")
in `phar:///opt/www/worker.phar/vendor/composer/ClassLoader.php` line 412

Заглушка (оригинальная заглушка здесь) выглядит так:

#!/usr/bin/env php
<?php
     Phar::mapPhar('worker.phar');
     require_once 'phar://worker.phar/vendor/autoload.php';

     //Execute next going fork code more then one 1 time
     ...
     $pid = pcntl_fork();
     if ($pid == -1) {
         die('could not fork');
     } else if ($pid) {
        // we are the parent
        ...
     } else {
        // we are the child
        ...
        exit(1);
     }

     __HALT_COMPILER();

Я не использую cache_list. Это происходит, только если phar сжат GZ или BZ2. Файлы Phar без сжатия не воспроизводят эту ошибку. Есть ли обходные пути или может быть какая-то информация об ограничении сжатых phars и разветвленных процессов?

02.04.2015

  • Что вы делаете с файлом PHAR? 03.04.2015
  • Выполните их. Могу добавить заглушку, если нужно. 03.04.2015
  • Здесь та же проблема, когда deployer.phar выполняется в сценарии bash. 29.10.2019

Ответы:


1

Расширение PHP Phar внутренне открывает файл Phar и использует операции поиска/сообщения/чтения этого дескриптора для чтения необходимых файлов из архива. Поскольку все разветвленные процессы используют один и тот же дескриптор и, следовательно, совместно используют указатель текущей позиции в файле, между этими операциями возникает состояние гонки.

Эта проблема легко воспроизводима и возникает как со сжатием, так и без него, но сжатие делает его более вероятным.

Я не уверен, что это на самом деле ошибка, потому что ее нелегко исправить со стороны PHP, и такая же проблема, вероятно, существует для любой функции PHP, которая имеет открытый дескриптор файла в фоновом режиме. Это больше проблема документации, в которой четко не указано, что все операции с одним и тем же файлом Phar используют один и тот же файловый дескриптор в фоновом режиме, даже если это не очевидно из кода PHP.

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

27.02.2020

2

Похоже на проблему с PHP. Сообщите об ошибке на странице https://bugs.php.net/ с инструкциями. воспроизводить.

26.01.2020
  • В моем случае проблема возникает случайно. Иногда это просто работает :-( 27.01.2020
  • Не могли бы вы предоставить минимальные шаги для воспроизведения, и если эту проблему можно наблюдать только в какой-то ситуации, попробуйте найти, как воспроизвести ее последовательно — например, упаковать 10 000 файлов и продолжать включать их в цикле. Затем попробуйте воспроизвести как на Linux, так и на Windows. 27.01.2020
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]