Unserialize Fehler beim @runInSeparateProcess

Ich implementiere ein Modul, das eine API bereitstellt, um mit PHP-Sitzungen zu arbeiten und diese zu verwalten. Ich teste dasSession\Manager Implementierung, mit der Benutzer Sitzungen starten, IDs festlegen, IDs abrufen, Sitzungen zerstören usw. Ich teste die Methoden in dieser Klasse in einem separaten Prozess mithilfe von PHPUnit@runInSeparateProcess Anmerkung. Wenn ich diese Annotation verwende, wird von PHPUnit aufgrund eines Unserialisierungsfehlers eine Ausnahme ausgelöst. Wenn ich die Annotation nicht verwende, wird der Test wie erwartet ausgeführt und schlägt fehl, wenn null nicht gleich false ist.

Hier ist der Test, der den Fehler verursacht. Bisher wurden keine Implementierungsdetails gemacht, alle Methoden für die Schnittstelle existieren, aber es werden keine Operationen ausgeführt.

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

}

Ich konnte das Problem auf Folgendes zurückführenPHPUnit_Util_PHP::runJob() Methode. Ich führe PHPUnit 3.7.5 und das ausrunJob Die aufgerufene Methode ist:

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

Die Linie$stdout = stream_get_contents($pipes[1]); Ergebnisse in$stdout einer langen Kette von?. Im$this->processChildResult der Wert in$stdout wird unserialisiert und der ungültige Wert, der an diese Funktion übergeben wird, löst eine Warnung aus, die zum Auslösen einer Ausnahme führt. Ich konnte auch feststellen, dass der Rückgabewert von$this->getPhpBinary() ist/usr/bin/php.

Ausnahmemeldung ausgelöst:

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


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

Dank hek2mgl den PHP Code rein$job kann überprüft werdenan dieser Stelle wird die Ausgabe eines var_dump auf $ job festgehalten. Ich habe einen Link erstellt, da es sich um ziemlich viel Code handelt und diese Frage bereits ziemlich lang ist.

Ich habe das Ende meines Wissens für diese bestimmte Domäne erreicht und bin mir nicht sicher, wie ich dieses Problem weiter beheben soll. Ich bin mir nicht sicher warum@runInSeparateProcess scheitert und warum die$stdout Wenn Sie einen separaten Prozess ausführen, wird eine lange Zeichenfolge von? Marken. Was kann dieses Problem verursachen und wie kann ich es beheben? Ich bin für dieses Modul im Stillstand, da zukünftige Tests in einem separaten Prozess ausgeführt werden müssen, um sicherzustellen, dass Sitzungen, die gestartet und zerstört werden, keine Auswirkungen auf Tests haben.

PHP: 5.3.15PHPUnit: 3.7.5Fehler in IDE- und Befehlszeilentestläufern

Antworten auf die Frage(3)

Ihre Antwort auf die Frage