Форум сетевых администраторов
Показаны 3 сообщений на этой странице

Форум сетевых администраторов (http://netadmin.ws/forum/index.php)
- PHP (http://netadmin.ws/forum/forumdisplay.php?forumid=6)
-- php демон...проблемка... (http://netadmin.ws/forum/showthread.php?threadid=12625)


Помещено RUNET 12-04-2007 в 22:44:

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

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

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

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

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

при вызове функции win32_stop_service() демон отваливается, но процесс останавливает.

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

собсно сам демон

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"); 
} 

// Слушаем вечно <img src="images/smilies/wink.gif" border="0" alt=""> 
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); 
?>


Помещено polo 13-04-2007 в 21:37:

ну вылететь может в случае ошибки записи сокета, обрати внимание что функция возвращяет кол-во записанных байт, а переменная $test нигде не определена, т.е. возвращается 0, выражение дает true, тут нужно изменить выражение так socket_write($accept, "$test") === false

__________________
Всегда есть решение.


Помещено RUNET 14-04-2007 в 16:21:

quote:
Первоначальное сообщение от polo
ну вылететь может в случае ошибки записи сокета, обрати внимание что функция возвращяет кол-во записанных байт, а переменная $test нигде не определена, т.е. возвращается 0, выражение дает true, тут нужно изменить выражение так socket_write($accept, "$test") === false


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

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

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

PHP:

// Считываем заданное количество байт из указанного сокета  
        
if(FALSE === ($line = @socket_read($accept, 2048)))


а точне в кол.ве считываемых байтов
пытался увеличить в раза (Как в демоне, так и в клиенте), но после этого демон падал мгновенно после отправки ему любой команды.

ну, как говорится, бэн ай нид хелп )


Формат времени GMT. Текущее время 04:58.
Показаны 3 сообщений на этой странице

Powered by: vBulletin Version 2.2.4
Copyright © Jelsoft Enterprises Limited 2000, 2001.