Hi Community,
Ich arbeite im Moment an einem PHP Programm das als Applikation auf einem Root server laufen wird. Die Problematik dabei ist, dass das PHP Programm das ich schreibe einerseits Eingaben von einem anderen Server über sockets erhalten muss, anderseits aber auch eigene "Timed Jobs" ausführen muss, d.h. eine Methode z.b. alle 3 Sekunden aufrufen.
Im Moment habe ich es so gelöst, dass eine Methode daten im non-blocking mode vom Server holt (bricht mit false ab falls unmöglich) und eine art "Registry" für die Timedjobs. Beides wird in einer while schleife hintereinander aufgerufen. Zudem habe ich einen utime() sleep drin, um die CPU nicht so hoch zu belasten (40ms pause zwischen 2 Schleifendurchläufen).
Hier bekommt ihr erstmal den Code (unwichtiges weggelassen (sonst wäre es über 500 Zeilen lang))
PHP-Code:
public function callbacks() {
$this->_callbacks();
if(count($this->receivedCallbacks)) {
foreach($this->receivedCallbacks as $key=>$callbackrcv) {
$cb = $callbackrcv[0];
$args = $callbackrcv[1];
unset($this->receivedCallbacks[$key]);
if(!array_key_exists($cb, $this->callbackRegistry)) {
continue;
}
foreach($this->callbackRegistry[$cb] as $toCall) {
$class = &$this->kernel->load($toCall[0]);
$method = $toCall[1];
call_user_func_array(array($class, $method), $args);
}
}
}
}
public function run() {
// [...]
$lasttime = time();
while (true) {
// Do timed actions
if($lasttime < time()) {
$lasttime = time();
if(count($this->timedRegistry)) {
foreach($this->timedRegistry as $key=>$value) {
if($lasttime%$key == 0) {
foreach($value as $timedJob) {
$class = &$this->kernel->load($timedJob[0]);
$method = $timedJob[1];
call_user_func(array($class, $method));
}
}
}
}
}
// Do callback bound actions
$this->callbacks();
// Wait some time (otherwise too heavy cpu weight)
usleep(400000);
// Flush the cache (delete unused Data)
flush();
}
}
Es funktioniert, doch was mich stört sind diese dauernde if und foreach anweisungen. Kann man das nicht noch runter kürzen? Wäre da für Vorschläge offen.
Ach ja die TimedJobs und Callback Funktionen werden wie folgt eingetragen und gespeichert
PHP-Code:
public function registerCallback($function, $callbackname) {
$this->callbackRegistry[$callbackname][] = $function;
}
public function registerTimedAction($function, $timeinterval) {
$this->timedRegistry[$timeinterval][] = $function;
}
Danke schonmal im voraus.
PS: Ich sollte noch erwähnen dass es hier vorallem um Speed geht