Главная :: Форум :: Web ClipArt :: Поиск :: Статистика :: Топ 10 :: Публикация :: Рекомендовать
netadmin.ws
Панель управления Регистрция свободна! Календарь Список пользователей Часто задаваемые вопросы Поиск по форуму Архив скриптов Главная   
Форум сетевых администраторов
Форум сетевых администраторов Форум сетевых администраторов » Программирование » PHP » php демон...проблемка...
Предыдущая тема     Следующая тема
Автор
Тема    Новая тема     Ответить на эту тему
RUNET
Участник
Средний рейтинг: 3 | Оценок: 2

Зарегистрирован: Mar 2003
Место проживания: Moscow
Публикаций: 27
Статус: RUNET в оф-лайне
php демон...проблемка... [сообщение #84843]

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

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

для этого к пхп был прикручен модуль 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); 
?>

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 12-04-2007 22:44
Нажмите сюда для просмотра профайла RUNET Отправить Персональное сообщение RUNET Посетить домашнию страничку RUNET! Найти сообщения от RUNET Добавить RUNET в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
polo
Администратор
Средний рейтинг: 4.77 | Оценок: 106
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус: polo в оф-лайне
[сообщение #84845]

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

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

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 13-04-2007 21:37
Нажмите сюда для просмотра профайла polo Отправить Персональное сообщение polo Посетить домашнию страничку polo! Найти сообщения от polo Добавить polo в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
RUNET
Участник
Средний рейтинг: 3 | Оценок: 2

Зарегистрирован: Mar 2003
Место проживания: Moscow
Публикаций: 27
Статус: RUNET в оф-лайне
[сообщение #84847]

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


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

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

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

PHP:

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


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

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

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 14-04-2007 16:21
Нажмите сюда для просмотра профайла RUNET Отправить Персональное сообщение RUNET Посетить домашнию страничку RUNET! Найти сообщения от RUNET Добавить RUNET в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя



Формат времени GMT. Текущее время 06:45.
Новая тема   Ответить на эту тему [ Версия для печати Печать | Отправить эту страницу другу/знакомому! Отправить | Получать уведомления об обновлении этой темы Подписка ] Предыдущая тема     Следующая тема
Навигация по форуму:
Оценка темы:

Правила форума:
Вы не можете создавать новые темы.
Вы не можете отвечать на существующие темы.
Вы не можете прикреплять файлы.
Вы не можете редактировать свои сообщения.
HTML теги выкл.
Спец. код вкл.
Смайлики вкл.
[IMG] тег выкл.
 

Page generated in 1.06170106 seconds (99.42% PHP - 0.58% MySQL) with 23 queries.


  Главная :: Форум :: Web ClipArt :: Поиск :: Статистика :: Топ 10 :: Публикация :: Рекомендовать
©NetAdmin.ws, 2001-2026.
Powered by: vBulletin
Copyright ©2000, 2001, Jelsoft Enterprises Limited.