PHP-Code:
<?php
error_reporting(~0);
class T extends Thread // PECL-Extension pthreads
{
private $oSuccessCallback;
private $oFaultCallback;
private $i;
/**
* @param SuccessCallback $oSuccessCallback
* @param FaultCallback $oFaultCallback
* @param int $i eindeutige Thread-Nummer
*/
function __construct(SuccessCallback $oSuccessCallback, FaultCallback $oFaultCallback, $i)
{
$this->oSuccessCallback = $oSuccessCallback;
$this->oFaultCallback = $oFaultCallback;
$this->i = $i;
}
/**
* @return int eindeutige Thread-Nummer
*/
function getI()
{
return $this->i;
}
/**
* Thread starten und geworfene Exceptions abfangen.
* Wird automatisch mit start() aufgerufen.
*/
function run()
{
try
{
echo 'start'.PHP_EOL;
// error triggern:
gibtEsNicht(); // Die Fatal error Ausgabe könnte man mit @ unterdrücken.
// Exception werfen:
//throw new Exception('xxx');
echo 'end'.PHP_EOL;
$this->oSuccessCallback->done($this);
}
catch(Exception $oE)
{
// Exceptions abfangen:
$this->oFaultCallback->exception($this, $oE);
}
}
}
class SuccessCallback
{
/**
* Wird automatisch vom Thread aufgerufen, wenn er erfolgreich beendet wurde.
*/
function done(Threaded $oThreaded)
{
echo $oThreaded->getI()." cuccess\n";
}
}
/**
* Fehlerbehandlung.
*/
class FaultCallback
{
/**
* Wird automatisch vom Thread aufgerufen, wenn ein error getriggert wurde.
* @param Threaded $oThreaded
*/
function error(Threaded $oThreaded)
{
echo $oThreaded->getI()." error\n";
var_dump($oThreaded->getTerminationInfo());
}
/**
* Wird automatisch vom Thread aufgerufen, wenn eine geworfen wurde.
* @param Threaded $oThreaded
* @param Exception $oE
*/
function exception(Threaded $oThreaded, Exception $oE)
{
echo $oThreaded->getI()." exception\n";
var_dump($oE);
}
// Kann bei Bedarf um weitere Exception-Methoden erweitert werden.
}
class ThreadWrapper
{
/**
* Thread starten und getriggerte errors abfangen.
* @param SuccessCallback $oSuccessCallback
* @param FaultCallback $oFaultCallback
* @param int $i eindeutige Thread-Nummer
*/
function start(SuccessCallback $oSuccessCallback, FaultCallback $oFaultCallback, $i)
{
$oT = new T($oSuccessCallback, $oFaultCallback, $i);
$oT->start(); // Die Fatal error Ausgabe könnte man mit @ unterdrücken.
// Wirft run() eine Exception, kann die danach nicht mehr mit try-catch abgefangen werden.
// Statt die Exception weiterzugeben, wird ein Fatal error getriggert.
// Der könnte unterdrückt werden, indem man start() ein @ voranstellt.
// isTerminated() erkennt den error dann trotzdem noch.
// errors abfangen:
$oT->join(); // warten, bis der Thread zu Ende ist
if($oT->isTerminated())
{
$oFaultCallback->error($oT);
}
}
}
$oSuccessCallback = new SuccessCallback();
$oFaultCallback = new FaultCallback();
$oT = new ThreadWrapper();
$oT->start($oSuccessCallback, $oFaultCallback, 1);
?>
Kommentar