Servus, also folgendes Problem:
Die Klasse macht einen ListenServer auf einem bestimmten Port (55555) und horcht auf Verbindungen. Die Commands die ankommen haben dann folgendes Format: array('command' => 'cm_xxx', 'arg1' => 'blubb' ...)
Das ganze rennt dann natürlich in der Console:
PHP-Code:
class ListenServer extends BaseServer
{
var $readEndCharacter = "\r\n\r\n";
function onReceiveData( $clientId, $data )
{
$request = unserialize( $data );
if( preg_match("/^cm_/i", $request['command']) )
{
switch($request['command']) {
case 'cm_system': $response = $this->Run($response, $request['arg1']);
break;
case 'cm_writefile': $response = $this->writeFile($response, $request['arg1'], $request['arg2']);
break;
case 'cm_getfile': $response = $this->getFile($response, $request['arg1']);
break;
default:
$response .= "no action found";
$this->sendDebugMessage("Server::Receive(): no matching action");
}
}
else
{
$response = "error\r\n"
}
$this->sendDebugMessage("Server::Send(): $response");
$this->sendData( $clientId, $response, false);
$this->closeConnection( $clientId );
}
function Run($res, $cmd) {
$this->sendDebugMessage("Server::Run(): $cmd");
if(!escapeshellcmd($cmd)) return false;
exec(escapeshellcmd($cmd), $o, $r);
$this->sendDebugMessage("Server::Run(): output: $o | res: $r | ret: ".serialize(array($o, $r)));
return $res . serialize(array($o, $r, 'return' => 'command executed')) . "\r\n\r\n";
}
function GetFile($res, $file) {
$str = file($file);
$this->sendDebugMessage("Server::getFile(): $file | str: " . serialize($str));
return $res . serialize($str) . "\r\n\r\n";
}
function WriteFile($res, $file, $str) {
$this->sendDebugMessage("Server::writeFile(): file: $file |str: $str");
if(is_link($file)) {
$this->sendDebugMessage("Server::writeFile(): deleting symlink: $file");
$this->Run('rm -f ' . $file);
$this->Run('touch ' . $file);
}
$fp = fopen($file, 'w');
foreach($str as $value) {
fwrite($fp, trim($value) . "\n");
}
fclose($fp);
return $res . "\r\n\r\n";
}
}
in meinem PHP Script (nicht in der Console, sondern normal Webserver) kommunisizere ich dann mit diesem Code: ($data = serialisiertes Array)
PHP-Code:
function DaemonSend($data) {
$socket = socket_create (AF_INET, SOCK_STREAM, 0);
$result = socket_connect ($socket, $ip, 55555);
$in = $data . "\r\n\r\n";
$out = '';
socket_write ($socket, $in, strlen ($in));
while ($res = socket_read($socket, 2048)) {
$out .= $res;
}
socket_close ($socket);
return unserialize($out);
}
so jetzt das Problem:
es geht alles reibungslos, nur wenn ich auf dem ListenServer die Methode Run() verwende und ein System Commando ausführen will, dann läuft mein PHP-Script auf dem Webserver in ner Endlosschleife. Bei allen anderen Methoden geht alles. Das System Commando wird sogar im Hintergrund gestartet & die Ausgaben umgelenkt (über ein Shellscript) so dass das Shellscript nur die PID von dem Ausgeführten Befehl zurückgibt. Wenn ich das gestartete Commando kille, dann lädt das Webserver-PHP File fertig.
An was kann das liegen ? Wenn ich dieselbe Run() Funktion local auf dem seelben Rechner ausführe wie mein Webserver-Script, dann geht alles optimal.
EDIT: ich habs auch mit anderen Fkt anstatt exec() versucht, aber mit allen dasselbe Problem
Lesezeichen