php демон...проблемка...

RUNET

Новичок
php демон...проблемка...

Собственно столкнулся со странной проблемой.

написан простейший демон
задача: управлять процессами винды (запустить, остановить).

для этого к пхп был прикручен модуль win32service.

Так вот, проблема вот в чем.

при вызове функции win32_stop_service() демон отваливается, но процесс останавливает.
p.s. при вызове win32_start_service() все работает отлично (пробывал даже 10 раз подрят поднимать процесс, все ок.

пробывал с другим модулем по управлению процессами, те же яйца вид с боку....

собсно сам демон
PHP:
<?php 

// Работаем вечно (выдаёт ошибку при safe_mode=1, @ для подавления) 
@set_time_limit(0); 

// Создание сокета TCP: resource socket_create(1, 2, 3); 
// 1) AF_INET - семейство протокола или домен. Для соединений 
//              осуществляемых через интернет используется AF_INET, 
//              для UNIX используется AF_Unix (но об этом позже) 
// 2) SOCK_STREAM - обычно используется для TCP (SOCK_DGRAM - UDP) 
// 3) Протокол для TCP - SOL_TCP, UDP - SOL_UDP 
// возвращает дескриптор сокета 
if(($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) 
{ 
    print("Невозможно создать сокет: " . 
        socket_strerror(socket_last_error()) . "\n"); 
} 

// Биндим сокет на определённый адрес и порт: boolean socket_bind(1, 2, 3); 
// 1) Дескриптор сокета 
// 2) IP адрес, или путь до сокета в Unix 
// 3) Порт (в нашем случае порт = 666) 
if(($error = socket_bind($socket, "127.0.0.1", 666)) < 0) 
{ 
    print("Невозможно привязать сокет :" . 
        socket_strerror(socket_last_error()). "\n"); 
} 

// Прослушиваем сокет: boolean socket_listen(1, 2); 
// 1) дескриптор сокета 
// backlog размер очереди запрросов ожидающих соединения 
if(($error = socket_listen($socket, 5)) < 0) 
{ 
    print("Невозможно прослушать сокет: " . 
        socket_strerror(socket_last_error()) . "\n"); 
} 

// Слушаем вечно ;) 
while(TRUE) 
{ 
    // ожидаем соединение 
    // socket_accept(дескрипток сокета) - принимает входящие соединение и делает на скрипт сервером. 
    if(($accept = socket_accept($socket)) < 0) 
    { 
        print("Ошибка при чтении: " .  
            socket_strerror($message) . "\n"); 
        break; 
    } 
     
    // юзер подключился
    print(date("Y-m-d H:i:s", time())." STATUS: client connected.\n"); 
    @ob_flush(); 
    while(TRUE) 
    { 
        // Считываем заданное количество байт из указанного сокета 
        if(FALSE === ($line = @socket_read($accept, 2048))) 
        { 
            print("Невозможно прослушать сокет: " .  
                socket_strerror(socket_last_error()) . "\n"); 
            break 2; 
        } 
         
	  list($case, $serv) = explode("|",$line);

        switch(strtolower(trim($case))) 
        { 
            case "bye"  : 
                print(date("Y-m-d H:i:s", time())." STATUS: client close connection.\n"); 
                break 2; 
            break; 

            case "uninstall"  :

	win32_stop_service($serv);

	$test = "Сервер успешно $case.";
               // записываем данные из буфера в сокет 
                if(!@socket_write($accept, "$test")) 
                {
                    print(date("Y-m-d H:i:s", time())." STATUS: client close connection.\n"); 
                    break 2; 
                }
            break; 

            case "install"  :

	win32_start_service($serv);

	$test = "Сервер успешно $case.";
               // записываем данные из буфера в сокет 
                if(!@socket_write($accept, "$test")) 
                {
                    print(date("Y-m-d H:i:s", time())." STATUS: client close connection.\n"); 
                    break 2; 
                }
            break; 

        } 
        print(date("Y-m-d H:i:s", time()). " COMMAND: ".$case." service $serv\n"); 
        @ob_flush(); 
    } 
    // закрываем соединение 
    socket_close($accept); 
} 
// Закрываем сокет 
socket_close($socket); 
?>
 

serglt

Анус, ой, Ахтунг
1. где ж таких извращенцев делают, которые пишут демоны и под винду и к тому же еще и win32.
2. правила форума почитай
 

RUNET

Новичок
почему сразу извращенцев ??

нука, приведика мне пример, как ты будешь управлять процессами (через веб!!) на винде с удаленной машины на которой стоит фря...

p.s. перл я не знаю...знаю ток пхп...

есть задача, её надо решить.

p.s.s. если не можешь ответить по делу, то лучше вобще молчи...

тьфу
 

ksnk

прохожий
Осталось только узнать - а не тот ли ты сервис пристреливаешь, который за целостность соединения отвечает? :)

win32service настолько специфическая вешь, что ее никто, даже, не откомментировал на php.net

Если демон просто падает - можно сначала запустить вторую версию скрипта, которая подождет немного и, если предыдущая версия не упала - тихонько закроется, иначе - работать-работать...

Когда я пытался удаленно управлять компьютером с Виндой - мне пригодился nncron. У него кроме шедулера есть еще и возможность запуска собственных задач из командной строки. Так что достаточно было поставить nncron, описать необходимые задачи, поставить Миранду, прикрутить к ней mbot'а и - вот он, готовый ремут акцесс по icq...
 

RUNET

Новичок
Нашел я в чем проблема.
Дело в том что сервис завершал свою работу по истечению 5000ms, за пускался после 3000ms.

Вобщем сделал shutdown тоже 3000ms и все стало норм.

Сокеты для меня в новинку (никогда с ними не работал), но поигравшись понял что дело в этой строке

PHP:
 if(FALSE === ($line = @socket_read($accept, 2048)))
а точнее в кол.ве считываемых байтов
пытался увеличить в раза (Как в демоне, так и в клиенте), но после этого демон падал мгновенно после отправки ему любой команды...

ща вроде пашет...пока не падало, хотелось бы конечно вникнуть в это дело по больше...
 

ONK

Пассивист PHPСluba
RUNET, где вы взяли этот помойный код?
Почитайте мануал по socket functions,,, у вас почти вся обработка ошибок неправильная, этот код работает на честном слове.
 
Сверху