Deamon Client + Server на PHP !!!!

Baranov_Dron

Новичок
cтранно, я один считаю, что php для таких целей не очень?
данную задачу по мне лучше решать на других языках, например C++, Java.
Сам лично писал icq бота, с возможностью отсылки смс. Пашед, но сложно контролировать, а именно какие лаги ловит, когда вылетает(сложно не запустить, а именно вычислить что рестарт нужен). Потом нужно делать аккуратно потоки. Смотреть защиту... И всё средствами php.... мне не понравилось((( забросил я идею демонов на php. Стараюсь ограничется кроном!
 

StUV

Rotaredom
Baranov_Dron
а какая разница?
если есть проблемы производительности - то да, пхп не подходит для таких задач
а написать кривое приложение с проблемами отладки и т.п.. - позволяет любой яп
 

fast2111

Новичок
>>данную задачу по мне лучше решать на других языках, например C++, Java.

не ну это правильно конечно, но кто будет строить дом на болоте, используя фундамент :)

Существующий и не удовлетворяющий "демон" на perle...
По мне лучше его переписать, если постановка задачи позволяет...
 

qazaqq

Новичок
Wicked

http://www.chabotc.com/phpsocketdaemon/

Вроди то, что доктор прописал! Наверно можно объеденить клиентскую часть с серверной..
Есть там и
PHP:
set_non_block(true)
и
PHP:
socket_select()
!!!
Только я не могу сообразить как с ним работать, не очень разбираюсь в классах...

ЛЮДИ помогите, давайте проведем эксперимент!!!:p
 

whirlwind

TDD infected, paranoid
qazaqq нарисуй data workflow. Определись, кто выступает инициатором процесса, как данные аккумулируются, куда, как клиенты получат к ним доступ, в каком виде эти данные клиенту отдаются. Даже в водопроводе имеет значение куда вода течет, не говоря уж о таком приложении. Это называется - протокол.
 

Wicked

Новичок
так и говори: "народ, сделайте все за меня" :)

я так понимаю, там тебе придется написать класс, который будет создаваться этой библиотекой на каждое принятое соединение 127.0.0.1:20000.

Он при своем создании будет создавать сокет-клиент, который уже будет коннектиться к 192.168.0.1:40000. Либо такой сокет-клиент может быть один и может быть создан при поднятии демона, но это если у тебя задача позволяет.

Далее просто налаживаешь коммуникации между объектами.
 

qazaqq

Новичок
так и говори: "народ, сделайте все за меня"
:) Ну еслиб кто помог или показал как, что в моем случае лепить, может быть и слепил бы,
просто сетевым программированием не занимался раньше...

я так понимаю, там тебе придется написать класс, который будет создаваться этой библиотекой на каждое принятое соединение 127.0.0.1:20000
Соединение между демоном и сервером - постоянное!!! А клиент если он есть, то есть...
В общем мне нужно постоянное соединение с ОДНИМ сервером и соединение хотяб с ОДНИМ клиентом....
 

StUV

Rotaredom
В общем мне нужно постоянное соединение с ОДНИМ сервером и соединение хотяб с ОДНИМ клиентом....
ты уверен, что оно реально нужно?

опиши нормально задачу - зачем тебе эти постоянные соединения и что мешает поднимать их по запросу клиента ?..

зы: хочешь - делай
никто не поможет тебе сделать то, что не понимает + понимает как раз наоборот - что тебе оно не надо (на самом деле =))

-~{}~ 29.04.08 17:51:

ззы: ну... или пиши подробное ТЗ и выкладывай с суммой оплаты в раздел "Работа"
 

qazaqq

Новичок
Ой, а как прикрепить файл то на форуме....???

Нарисовал уже в картинках и назначение написал...
 

Wicked

Новичок
А клиент если он есть, то есть...
и соединение хотяб с ОДНИМ клиентом....
во-первых, ты сам себе противоречишь.

во-вторых, если ты хочешь нормальной помощи, опиши нормально задачу, которую решаешь. С описанием бизнес-логики, и твоего приблизительного виденья, чо куда должно коннектиться, что забирать, чего ждать, что отдавать, по каким событиям и т.д... а то получается как у дядюшки Корнея:
Но он только "му" да "му",
А к чему, почему -
Не пойму!
 

qazaqq

Новичок
#####################################
#
# http://drop.io/laccr8b
#
#####################################

Вот выкладываю долгожданную задачу, которую надеюсь решить...

Wicked
Имелось ввиду, что висим постоянно в коннекте с клиентом, когда он есть, когда присоединился!!!!:)
 

Alexandre

PHPПенсионер
cтранно, я один считаю, что php для таких целей не очень?
данную задачу по мне лучше решать на других языках, например C++,
полностью согласен, на пхп демоны неустойчивы и жрут много памяти,
не для демонов придумали пхп. каждую задачу нужно решать тем инструмантом, для которой он предназначен.
 

StUV

Rotaredom
Alexandre
не всегда так
пхп-демон может быть быстрым решением (быстрым в разработке)

на пхп демоны неустойчивы и жрут много памяти
согласись, на Си сожрать память можно гораздо быстрее ;)
 

qazaqq

Новичок
Не знаю, можно ли это назвать достижением, но вот таки решил начать писать сам...:(
Сразу скажу, сильно не судите, потому как вообще раньше с процессами и демонами не дружил...
Также хочу выразить RESPECT - Akick Именно благодаря ему глянул в сторону pcntl_PHP !!!, хотя и не знаю, что будет в итоге...

А теперь, в двух словах, что получилось:
1) При запуске демона, сразу же создается 3 процесса, я их назвал так: "Main process, Client process, Server process".
На экран выводятся сообщения запущенного процесса и его PID:

Запуск дочернего процесса: 31765
Запуск дочернего процесса: 31766
Запуск главного процесса: 31764


2) Процессы действительно создаются и устойчиво работают, как и должно быть...!
3) В процессах Client process и Server process происходит независимая запись в файлы
4) В Main process попытался написать слежение за дочерними просессами, правда без использ. сигналов...
В результате, если прибить один из доч. процессов, Main process выводит в консоль сообщение:

Процесс 31766 был неестественно уничтожен

Если прибить и второй доч. проц., то демон в целом завершает работу. То есть получилось, что Main ждет завершения
потомков и вырубается сам...
Если прибить Main первым то доч. процессы продолжают свое независимое существование:D

Вот собственно код:
PHP:
#!/usr/bin/php -q
<?PHP

$child = array();

// Запускаем CLIENT - дочерний процесс
if(($pid = pcntl_fork()) == 0) {
exit(client_process());
}else{
$child[] = $pid;
}

// Запускаем SERVER - дочерний процесс
if(($pid = pcntl_fork()) == 0) {
exit(server_process());
}else{
$child[] = $pid;
}

//print_r($child);


$my_pid = getmypid();
print "Запуск главного процесса: $my_pid\n";

# ******************  Main process  ********************************************

//  Здесь, наверно, будем обрабатывать сигналы от дочерних
//  процессов и возможно перезапускать, в случае ошибки !!

foreach($child as $pid) {
$pid = pcntl_wait($status);
if(pcntl_wifexited($status)) {
$code = pcntl_wexitstatus($status);
print "Процесс $pid возвратил код выхода: $code\n";
}
else {
print "Процесс $pid был неестественно завершон\n";
}
}

# ******************  Client process  ******************************************
function client_process(){
$my_pid = getmypid();
print "Запуск дочернего процесса: $my_pid\n";

while(true){
sleep(1);

$fk = fopen('/tmp/daemon1.log', 'a');
fwrite($fk, date("Y/m/d H:i:s "). "1111111111\n");
fclose($fk);

}
}
# ******************  Server process  ******************************************
function server_process(){
$my_pid = getmypid();
print "Запуск дочернего процесса: $my_pid\n";

while(true){
sleep(1);

$fs = fopen('/tmp/daemon2.log', 'a');
fwrite($fs, date("Y/m/d H:i:s "). "2222222222\n");
fclose($fs);

}
}
# ******************************************************************************
?>
Теперь вижу задачу в следующем:
1) Пока не знаю как передать значение переменной из сервера клиенту и наоборот....
2) Попробовать вписать реальный код Socket - сервера и клиента, попробовать...
3) Добиться всетаки, чтоб по завершении Main processa падали и потомки...
4) Разобраться в управлении сигналами, а то ф-я pcntl_wait не дает обрабатывать дальнейший код в Main(Это я не понял)
И т.д.

Может кому пригодиться именно такое начальное решение, я пока прицеливаюсь...
Господа эксперты, что скажете по коду, что посоветуете, чем может поможете...?
 
Сверху