Ошибка десериализации при @runInSeparateProcess

Я реализую модуль, который предоставит API для работы и управления сессиями PHP. Я тестируюSession\Manager реализация, которая позволит пользователям запускать сеансы, устанавливать идентификаторы, получать идентификаторы, уничтожать сеансы и т. д. Я тестирую методы в этом классе в отдельном процессе, используя PHPUnit's@runInSeparateProcess аннотаций. Когда я использую эту аннотацию, я получаю исключение, генерируемое PHPUnit из-за ошибки десериализации. Когда я не использую аннотацию, тест выполняется, как ожидалось, и завершается неудачно, если значение NULL не равно false.

Вот'Тест, вызвавший ошибку. До сих пор не было сделано никаких подробностей реализации, все методы для интерфейса существуют, но не выполняют никаких операций.

class ManagerTest extends PHPUnitTestCase {

    /**
     * Ensures that if the session has not been started yet the sessionExists
     * method returns false.
     *
     * @runInSeparateProcess
     */
    public function testSessionExistsWhenSessionHasNotBeenStarted() {
        $Manager = new \Session\Manager();
        $this->assertFalse($Manager->sessionExists());
    }

}

Я смог отследить проблему до следующегоPHPUnit_Util_PHP::runJob() метод. Я использую PHPUnit 3.7.5 иrunJob вызываемый метод:

/**
 * Runs a single job (PHP code) using a separate PHP process.
 *
 * @param  string                       $job
 * @param  PHPUnit_Framework_TestCase   $test
 * @param  PHPUnit_Framework_TestResult $result
 * @return array|null
 * @throws PHPUnit_Framework_Exception
 */
public function runJob($job, PHPUnit_Framework_Test $test = NULL, PHPUnit_Framework_TestResult $result = NULL)
{
    $process = proc_open(
      $this->getPhpBinary(),
      array(
        0 => array('pipe', 'r'),
        1 => array('pipe', 'w'),
        2 => array('pipe', 'w')
      ),
      $pipes
    );

    if (!is_resource($process)) {
        throw new PHPUnit_Framework_Exception(
          'Unable to create process for process isolation.'
        );
    }

    if ($result !== NULL) {
        $result->startTest($test);
    }

    $this->process($pipes[0], $job);
    fclose($pipes[0]);

    $stdout = stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    $stderr = stream_get_contents($pipes[2]);
    fclose($pipes[2]);

    proc_close($process);
    $this->cleanup();

    if ($result !== NULL) {
        $this->processChildResult($test, $result, $stdout, $stderr);
    } else {
        return array('stdout' => $stdout, 'stderr' => $stderr);
    }
}

Линия$stdout = stream_get_contents($pipes[1]); результаты в$stdout быть равным длинной строке?, В$this->processChildResult значение в$stdout не сериализуется, и недопустимое значение, переданное этой функции, вызывает предупреждение, в результате чего генерируется исключение. Я'мы также смогли определить, что возвращаемое значение$this->getPhpBinary() является ./usr/bin/php

Брошено исключительное сообщение:

PHPUnit_Framework_Exception: ???...???"*???...??


Caused by
ErrorException: unserialize(): Error at offset 0 of 10081 bytes

Благодаря hek2mgl код PHP в$job можно просмотретьв этом гисте, содержащем вывод var_dump на $ job, Я создал ссылку, так как она содержит большое количество кода, и этот вопрос уже довольно длинный.

Мы достигли конца моих знаний по этому конкретному домену и не уверены, как дальше отлаживать эту проблему. Я'я не уверен, почему@runInSeparateProcess терпит неудачу и почему$stdout от запуска отдельного процесса приводит к длинной строке? Метки. Что может быть причиной этой проблемы и как я могу решить ее? Я'm в состоянии покоя для этого модуля, так как будущие тесты потребуют запуска в отдельном процессе, чтобы гарантировать, что сеансы запускаются и уничтожаются.t ударные испытания.

PHP: 5.3.15PHPUnit: 3.7.5Ошибка, вызванная в средах тестирования IDE и командной строки

Ответы на вопрос(3)

Ваш ответ на вопрос