Unserialize error, gdy @runInSeparateProcess

Wdrażam moduł, który zapewni interfejs API do pracy z sesjami PHP i zarządzania nimi. TestujęSession\Manager implementacja, która umożliwi użytkownikom uruchamianie sesji, ustawianie identyfikatorów, uzyskiwanie identyfikatorów, niszczenie sesji itp. Testuję metody w tej klasie w oddzielnym procesie, używając PHPUnit's@runInSeparateProcess adnotacja. Kiedy używam tej adnotacji, otrzymuję wyjątek zgłoszony przez PHPUnit z powodu błędu unserializacji. Gdy nie używam adnotacji, test działa zgodnie z oczekiwaniami i kończy się niepowodzeniem, gdy wartość null nie jest równa false.

Oto test powodujący błąd. Do tej pory nie zostały wprowadzone szczegóły implementacji, wszystkie metody interfejsu istnieją, ale nie wykonują żadnych operacji.

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());
    }

}

Udało mi się prześledzić problem aż do następującychPHPUnit_Util_PHP::runJob() metoda. Używam PHPUnit 3.7.5 irunJob wywoływana metoda to:

/**
 * 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);
    }
}

Linia$stdout = stream_get_contents($pipes[1]); prowadzi do$stdout równy długiemu ciągowi?. W$this->processChildResult wartość w$stdout jest unserialized, a niepoprawna wartość przekazana do tej funkcji uruchamia ostrzeżenie, co powoduje zgłoszenie wyjątku. Udało mi się również określić, że wartość zwracana$this->getPhpBinary() jest/usr/bin/php.

Zgłoszony wyjątek:

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


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

Dzięki hek2mgl kod PHP w$job można przejrzećw tym gist trzymając dane wyjściowe zmiennej var_dump w $ job. Stworzyłem link, ponieważ jest to spora ilość kodu i to pytanie jest już dość długie.

Dotarłem do końca mojej wiedzy dla tej konkretnej domeny i nie jestem pewien, jak dalej debugować ten problem. Nie jestem pewien dlaczego@runInSeparateProcess zawodzi i dlaczego$stdout od uruchomienia oddzielnego procesu powoduje powstanie długiego ciągu? znaki. Co może powodować ten problem i jak mogę rozwiązać ten problem? Jestem w stanie tego modułu, ponieważ przyszłe testy będą wymagały uruchomienia oddzielnego procesu, aby zapewnić rozpoczęcie sesji i jej zniszczenie, a nie testy.

PHP: 5.3.15PHPUnit: 3.7.5Błąd spowodowany w programach IDE i testerach wiersza poleceń

questionAnswers(3)

yourAnswerToTheQuestion