PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ich fixe eure PHP-Fehler



VeN0m
10.04.2009, 20:31
Grüßt euch,

Da mir hier schon mehrfach durch Tutorials oder User geholfen wurde habe ich diesen Thread geöffnet. Ich biete euch an eure Fehler zu beheben, wenn ihr nicht weiter wisst. Und zwar egal, wie lang das Script ist.
Die einzige Einschränkung ist, dass es keine Scripte sein sollten, die in einem CMS verwendet werden und mehrere weitere Dateien benötigen, um zu funktionieren. Sie sollten also aufrufbar sein ;). Ansonsten legt bitte die benötigten Dateien bei ;).
Postet eure Scripte einfach hier oder schreibt mir eine persönliche Nachricht.
Ich suche und behebe dann die Fehler oder optimiere das ganze Script. Ich hoffe ich kann ein Paar Leuten damit helfen.
Ach... Und nutzt vorher bitte Google oder die SuFu, damit nicht Fehler, die schon mehrfach erklärt wurden dauernd behoben werden müssen ;). Außerdem sollte genannt sein, wozu das Script überhaupt gut ist. Eine Fehlersuche ohne das zu wissen wäre Wahnsinn bzw. sehr schwer.

H4x0r007
10.04.2009, 23:12
[...]und mehrere weitere Dateien benötigen, um zu funktionieren.

Gerade das Auslagern von Funktionen und Klassen machen größere Projekte aus. Ich habe hier auf dem PC kein einzigstes PHP Script, dass nur aus einer Datei besteht. Wie soll ich alle Klassen in einer Datei unterbringen? ;-)

VeN0m
10.04.2009, 23:22
Auch wahr... Ich habe den ersten Post mal angepasst. Sollten andere Dateien benötigt werden sollten diese beigelegt werden. So habe ich das eigentlich gemeint (also mit aufrufbar sein) ;). Danke aber für den Hinweis sonst hätte ich das nicht gemerkt ^^.

2called-chaos
11.04.2009, 12:29
Hmm falls du noch nichts zu tun hast kannste ja mal gucken ob du in PHP nen PHP Socket Echo hinkriegst ^^

Also ein Socket auf welches mehrere Clients gleichzeitig connecten können. Und mit PHP sollen die Daten verarbeitet werden können die der Client schickt (und ein return wert sollte zurückgegeben werden)...

Verzweifle irgendwie schon was länger daran (3 mal hab ich mich schon rangesetzt)...


Mfg

Chaos

GregorSamsa
11.04.2009, 12:57
Wie hast du das versucht Chaos?

Setz mal script_timeout auf 0 und lass das über die Konsole laufen, nicht übern Browser...

Das könnte helfen

2called-chaos
11.04.2009, 13:02
Ja ne soweit war ich schon ;)

Nur hab ich den Ablauf an sich nicht hinbekommen...

Socket erstellt und gebinded, etc... Dazu gibt es ja auch ein paar Tutorials bzw. Vorlagen...
Aber das Script soll später quasi so funktionieren, dass ich den "Server" auf einem bestimmten Port ansprechen kann (von außerhalb jetzt) um ihm dann Daten zu senden, die er dann verarbeitet und einen return wert oder string zurücksendet, welches dann der Client auswertet... (zu Demonstrationszwecken ein einfaches echo)

Vielleicht kriegst du da ja was zusammengebastelt...


Mfg

Chaos

VeN0m
11.04.2009, 13:10
Hast Du denn mal Deine Anfänge, damit wir mal drübersehen können? ;)
So unbedingt auskennen tue ich mich mit Sockets nicht. Aber ansehen kann man das wohl mal... Es findet sich sicher eine Lösung.

GregorSamsa
11.04.2009, 13:24
So, hab das mal auf die schnelle zusammengetippt (ist das erste mal mit Sockets bei mir xD)

Bei mir funktioniert das - du musst ne Verbindung (mit telnet oder Netcat) auf Port 12321 zu Localhost amchen


<?php

set_time_limit(0);

$socket = socket_create_listen(12321);

$connection = 0;

echo "Warte auf Connection...\n";
while(!$connection = socket_accept($socket))
{
echo "Warte auf Connection...\n";
sleep(1);
}

socket_getpeername($connection, &$addr);
echo "Connection: " . $addr . "\n";

$str = socket_read($connection, 1024);
echo "Empfangen: " . $str . "\n";

$str = "Selber " . $str;
echo "Sende: " . $str . "\n";
socket_send($connection, $str, strlen($str), 0);

socket_close($socket);
socket_close($connection);

?>

2called-chaos
11.04.2009, 13:45
Ja aber der geht dann zu...
Soweit hatte ich das auch schon zum laufen gebracht... Aber das ich mehrere Clients bediene krieg ich einfach nicht hin (und halt mit while(true) inner Endlosschleife)...


Mfg

Chaos

GregorSamsa
11.04.2009, 13:52
Aso

mehrere Clients gleichzeitig? Nen Multiselect-Socket... Keine Ahnung, ob PHP das überhaupt unterstützt - schau dir dazu lieber mal C an: http://c-worker.ch

hpoc
11.04.2009, 14:52
Also mit PHP und Socket ist sowas mit Sicherheit lösbar.
Ich würde mal spontan sagen, da fehlt irgendwo ein "SOCK_STREAM".

K1ngC0bra
11.04.2009, 20:32
Also ich würde wenn ich etwas mit mehreren Clients benötige mit Flex lösen - geht ruckzuck :). Kanns dich ja mal erkundingen falls du interesse hast oder mich fragen, helfe gerne.

2called-chaos
11.04.2009, 20:44
Würde das schon gerne in PHP machen :)
Ich weiß das PHP nicht so wirklich dafür ausgelegt ist aber ich kann nur PHP :)

Und ein Framework oder ähnliches (meinst du Adobe Flex?) nutze ich auch sehr ungerne ^^


Mfg

Chaos

GregorSamsa
11.04.2009, 21:02
@hpoc: Würd ich nicht sagen ;-)

socket_create_listen() erstellt nen Listen-Socket - brauchst dazu kein socket_create()

Was man braucht ist socket_select()
Du musst (im Prinzip) z.B. 10 Sockets erstellen, und die über ein Array in einer Endlos-Schleife immer wieder mit socket_select() überprüfen - anders würd ich sagen, wird das nichts...

hpoc
11.04.2009, 21:11
Ich glaube da gibt es mit sicherheit eine einfachere lösung.
Ich werde mich Morgen mal an das Problem setzen und hoffentlich schon bald die Lösung presentieren können.

GregorSamsa
11.04.2009, 21:25
Das ist die einfachste Lösung =)

In C funktioniert das genau so - socket_select() macht nichts anderes, als zu überprüfen, ob es Vorgänge an einer Reihe von Sockets gab.

Das Problem bei der Geschichte ist das, dass mehrere Sockets Parallel bearbeitet werden müssen - auf dem gleichen Port.

Du wirst da keine einfachere Lösung finden...

blackberry
11.04.2009, 22:09
Ich habe da mal schnell was geschrieben:

<?php

if (!pcntl_fork()) die("starting the server...\n");

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, '127.0.0.1', 1234);
socket_listen($sock, 5);

$clients = 0;

for(;;)
{
if (($csock = socket_accept($sock)))
{
$pid = pcntl_fork();
$clients++;
if ($pid == -1)
{
die("couldn't fork()\n");
}
elseif ($pid > 0) // wir sind nicht der Vater ;)
{
$msg = "Hello, you are client #${clients}\n";
socket_send($csock, $msg, strlen($msg), 0);
while(socket_recv($csock, $buffer, 1024, 0))
{
if ($buffer != NULL)
{
$msg = '>> '.$buffer;
socket_send($csock, $msg, strlen($msg), 0);
}
}
exit(0);
}
}
}

?>

Diese Lösung ist zwar nicht sehr schön, da für jeden Client ein neuer PHP-Prozess gestartet wird, aber es funktioniert!

Benötigt werden die socket- und die pcntl-Erweiterungen.

Ansonsten kann ich auf den zweiten Kommentar auf folgender PHP-Manual-Seite verweisen, welcher eine Lösung mit nicht blockierenden Sockets vorstellt:
http://de2.php.net/manual/en/function.socket-accept.php


mfG. BlackBerry

GregorSamsa
11.04.2009, 22:21
Was du machen kannst ist, statt socket_create, socket_bind und socket_listen einfach nur socket_create_listen() nehmen...

Ich habs nicht ausprobiert, aber ne Verbindung zwischen den Sockets geht da nicht, oder? Quasi wie bei einem Chatserver

2called-chaos
12.04.2009, 15:01
aber ne Verbindung zwischen den Sockets geht da nicht, oder?
Wenn du von jedem Client die Daten bekommst und auch an alle welche senden kannst geht es :)
Nur gerade das ist ja mein Problem... Mehrere Clients ^^


Mfg

Chaos

//EDIT: Ich hab da mal den Link wiedergefunden nur funzen tut das bei mir nicht Ó.ò
http://www.jex-treme.de/forum/thread.php?threadid=19375