XaraX: simpler Web Service mit ein paar Feinheiten

Beitrag lesen

Hallo PHP-Gemeinde,

Hallo PHPler ;)

Nun weiß ich noch nicht so recht, WIE ich das ganze anbieten soll - als Bibliothek zum Downloaden und Einbinden (wovon ich grundsätzlich kein großer Fan bin, da jede Änderung am Projekt an sich einen neuen Download durch den User erforderlich macht) oder stets aktuell als Web Service (was die Sache jedoch zunächst etwas komplizierter macht), was mir lieber wäre und im Regelfall auch ohne Anpassungen auf der Clientseite machbar sind, solang sich an der Methodenstruktur nichts ändert.

Deine Frage nach dem "WIE" ist mir noch nicht klar geworden. Wenn Du einen Service anzubieten hast, dann vergib dafür einen freien Port (z. B. 1100), denke Dir ein Protokollverfahren aus und setze es in Client und Serversoftware um. Eine als Server konfigurierbare TCP-Classe gibts schon mal von mir:

  
<?php  
declare(ticks=1);  
define(PID,posix_getpid());  
  
class tcp{  
 public function tcp($host){  
  $this->connect =stream_socket_server('tcp://'.$host);  
  $this->docroot ='/tmp';  
  $this->user ='nobody';  
  $this->lib ='';  
  
  posix_setsid();  
  posix_setgid(PID);  
  posix_setpgid(PID,PID);  
 }  
 public function child($zahl){  
  $a=posix_getpwnam($this->user);  
  posix_setuid($a['uid']);  
  posix_setgid($a['gid']);  
  chdir($this->docroot);  
  chroot($this->docroot);  
  
  for($i=0;$i<$zahl;$i++){  
   $this->pid[$i]=pcntl_fork();  
   if($this->pid[$i]==0){  
    include($this->lib.'.obj');  
    while(1){  
     $a=new $this->lib($this->connect);  
     if(memory_get_usage()>200000)  
      exit;  
    }  
    exit;  
   }  
  }  
  $this->wait();  
 }  
 private function wait(){  
  if(PID==posix_getpid()){  
   $s=array(SIGQUIT,SIGHUP,SIGTERM,SIGCHLD);  
   foreach($s as $v)  
    pcntl_signal($v,array(&$this,"signal"));  
  }  
  
  while(1){  
   foreach($this->pid as $k=>$v)  
    if(pcntl_waitpid($v,$i,WNOHANG)==-1){  
     unset($this->pid[$k]);  
     $this->child(1);  
    }  
   sleep(1);  
  }  
 }  
 public function signal($s){  
  $c=count($this->pid);  
  foreach($this->pid as $v)  
   posix_kill($v,SIGTERM);  
  
  if($s==SIGTERM || $s==SIGQUIT)  
   exit(0);  
  else{  
   $this->pid=array();  
   $this->child($c);  
  }  
 }  
}  
$a=new tcp('localhost:80');  
$a->user ='Servicedeamon';  
$a->docroot ='/opt/neuerService/data';  
$a->lib  ='http';  
$a->child(5);  
?>  

Na ok, reines HTTP gibts natürlich auch, aber das ist ja schon wieder etwas arg primitiv und fehleranfällig, wenn man die URL selber aufbauen muss. :)

Wie gesagt, denk Dir Dein eigenes Protokoll aus... hilfe, wenn es nicht weiter geht, bekommst Du hier.

  1. Und gibts da weiterhin noch einen Trick, sodass auch jederzeit die URL des Web Services geändert werden kann und die aufrufenden Seiten dennoch funktionieren (wie eine solche DHCP-ähnliche Zuständigkeitsermittlung im Web zuverlässig funktionieren soll, weiß ich allerdings auch nicht...), ohne, dass ich alle aufrufenden Programmierer einzeln informieren muss, sofern ich sie überhaupt kenne? :) Da wär so was wie ein Weiterleitungsserver ganz recht, wenn es für solche Zwecke welche gibt.

Auch dort werden Informationen über die Ablage von Informationen von (einer) zentralen Stelle(n) abgerufen. Eine feste IP-Adresse brauchst Du also.

Gruß aus Berlin!
eddi