php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 25.07.2004, 15:01  
Gast
 
Beiträge: n/a
Standard [Erledigt] ResourceHandles und SharedMemory

So,

jetzt habe ich mal wieder etwas für PHP Profis und Gurus *g*

Via fork erstelle ich drei Prozesse. Nennen wir sie mal "main", "parser" und "queue". main nimmt auf einem lauschenden Socket Verbindungen entgegen, der parser-Prozess parsed die Nachrichten die über die Verbindung rein kommen und die queue Verteilt die Nachricht an die betroffenen Clients. Zu dem Zeitpunkt als die Anwendung noch ohne mehrere Prozesse lief, habe ich einfach folgendes getan:

PHP-Code:
<?php
$connection 
socket_accept($this->listen);
$this->clients[$socket] = new client($socket);
?>
So bekomme ich den resource handler in ein Objekt client und kann später auf diesen Zugreifen. Da ich nun mit mehrern Prozessen arbeite, geht das nicht mehr so einfach. Anfangs dachte ich mir, das ich $this->clients einfach mit einem passenden Array in einem shared memory ablege. Das funktioniert um Grunde auch, aber leider kann man im shared memory anscheinend keine resource handles ablegen.

PHP-Code:
<?php
var_dump
($out_clients);
shm_put_var($this->memory_key1$out_clients);
$out_clients shm_get_var($this->memory_key1);
var_dump($out_clients);
?>
Die Ausgabe dazu sieht so aus:
Zitat:
array(1) {
[18]=>
object(client)#3 (6) {
["connection:private"]=>
resource(18) of type (Socket)
["type:private"]=>
string(3) "OUT"
["cookie:private"]=>
string(5) "cookie_value"
["first_action:private"]=>
int(1090759921)
["last_action:private"]=>
int(1090759921)
["message:private"]=>
NULL
}
}
array(1) {
[18]=>
object(client)#4 (6) {
["connection:private"]=>
int(0)
["type:private"]=>
string(3) "OUT"
["cookie:private"]=>
string(5) "cookie_value"
["first_action:private"]=>
int(1090759921)
["last_action:private"]=>
int(1090759921)
["message:private"]=>
NULL
}
}
Wie man sieht geht $connection verloren. Jetzt die Frage: Wie bekomme ich den SocketHandler vom Prozess main in die anderen Prozesse?

Mensch hab ich wieder geile Fragen *g* Nur als Hinweis: ich sitze jetzt seit 2 Tagen vor dieser Problemstellung und habe keine Lösung finden können.

Gruß,


-Funny-
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 27.07.2004, 07:12  
Gast
 
Beiträge: n/a
Standard

Lies Dir mal unter http://publib16.boulder.ibm.com/pser.../skt_comms.htm den Abschnitt UNIX Domain Properties durch.
  Mit Zitat antworten
Alt 27.07.2004, 17:46  
Gast
 
Beiträge: n/a
Standard

Also wenn ich das richtig verstanden habe, kann ich mein Vorhaben nur mit Hilfe eines Unix Domain Sockets (AF_UNIX) realisieren. Ist eine interessante Sache, da ich mich damit eh mal beschäftigen wollte, aber leider bringt mir das nicht viel, da mein Script einen AF_INET Socket benötigt. Sonst wird das mit einem connect von "außen" ziemlich schwer. Dann komme ich wohl nicht drum rum, das Design so zu ändern, das ein einziger Prozess für die Daten Ein- und Ausgabe verantwortlich ist. Das verlangsamt die Vorgäng nätürlich. Ich hatte mir nämlich Urspünglich gedacht das ich den Prozess "main" zur Eingabe, den Prozess "parser" zur Verarbeitung und den Prozess "mqueue" zur Ausgabe verwende. So könnten Ankommende Daten angenommen und verarbeitet werden, während die mqueue mit dem Verteilen der Daten beschäftigt ist.
  Mit Zitat antworten
Alt 27.07.2004, 20:04  
Gast
 
Beiträge: n/a
Standard

das unix socket wird nur für Kommunikation zwischen den beiden Prozessen benötigt. Ansonsten lass die Prozesse sich doch erst nach dem accept gabeln.
PHP-Code:
<?php
$connection 
socket_accept($this->listen);
$pid pcntl_fork();
if(-
1==$pid)
    ; 
// Fehlerbehandlung einbauen
else if(0!=$pid)
{
    
// alter prozess
    
socket_close($connection);
}
else
{
    
// Kindprozess
    // hat auch eine Kopie von $this->listen erhalten
    
socket_close($this->listen);

    
// irgendwas mit $connection machen...
}    
?>
  Mit Zitat antworten
Alt 27.07.2004, 22:09  
Gast
 
Beiträge: n/a
Standard

Eigentlich wollte ich drei feste Prozesse. Aber das ist natürlich auch eine Möglichkeit... für jede parsende Message wird ein Prozess erstellt der die Message parsed und vorteilt. Da er eine Kopie aller Verbinungen hat, sollte das ja klappen. Oder Spricht da was gegen?
  Mit Zitat antworten
Alt 27.07.2004, 22:54  
Gast
 
Beiträge: n/a
Standard

Wenn, dann nur die Zeit, die das Erstellen eines neuen Prozesses verschlingt.
Mit php habe ich das allerdings noch nicht versucht.
  Mit Zitat antworten
Alt 28.07.2004, 17:42  
Gast
 
Beiträge: n/a
Standard

Ich auch nicht, aber das ist ja ein Teil dieses Projektes. Ich möchte unteranderem heraus finden wie PHP auf solche schon recht komplexen Anforderungen reagiert. Ich hoffe nur das PHP ein gutes MemoryManagment hat, und ich nicht bei 5 Verbindungen schon 50MB weniger Speicher zur Verfügung habe.
  Mit Zitat antworten
Alt 29.07.2004, 23:13  
Gast
 
Beiträge: n/a
Standard

Und was da eigentlich alles dupliziert wird. Wenn es tatsächlich "nur" ein fork() ist, hieße das bei php als Apache-Modul z.B. dass der Apache-Prozess dupliziert wird - oder irre ich da? Und wenn dem so ist, was passiert in der Zeit, die der (php-)Kindprozess benötigt, mit den offenen Apache-sockets und sonstigen Deskriptoren?
Offen gesagt übersteigt das meine Unix-Kenntnisse und dafür ist die PCNTL-Erweiterung auch vermutlich nicht gedacht.
  Mit Zitat antworten
Alt 31.07.2004, 12:15  
Gast
 
Beiträge: n/a
Standard

Dieses Script läuft nicht unter dem Apache sondern stellt selbst die Server-Funktionalität her.

Code:
php -f cs.php > output.log &
Und so läuft das Script dann in einer Endlosschleife und spielt Server.

Zitat:
Zitat von VolkerK
[...]und dafür ist die PCNTL-Erweiterung auch vermutlich nicht gedacht.
Nun ja, ich kann mir schon vorstellen das PCNTL-Erweiterung eher dazu gedacht war, den Child-Prozess irgendwelche Hintergrundaufgaben zu geben wie z.b. aufräumen von Session-Tabellen in einer Datenbank. Bei entsprechend großen Tabellen kann es ja durchaus Sinn machen, dies nicht den Hauptprozess tun zu lassen, damit dieser schon in aller Ruhe den Client weiter bedienen kann.
  Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php shm_put_var tutorial, fehler beim verteilen eines duplizierten sockets: dieses handle geht jetzt im prozess verloren., php shared memory fork, shared memory php für was, objekte in shared memory php, php kommunikation zwischen zwei prozessen pcntl, ressource shared memory php, php fork memory shared

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:44 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.