ICQ и PHP (скрипт, который длится вечно)

asm

Пофигист
ICQ и PHP (скрипт, который длится вечно)

Написал я недавно класс позволяющий коннектиться к ICQ (через сокеты) и отправлять сообщения.

А вопрос вот в чем: как организовать что бы соединение с ICQ сервером не прерывалось? Ибо после завершения работы скрипта соединение прерывается. И потом опять приходиться его устанавливать, что не очень хорошо ибо ICQ ругается если часто коннектиться.
 

Кром

Новичок
>завершения работы скрипта соединение прерывается.

Это вполне естественно.

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

-~{}~ 17.02.05 18:02:

Кстати, класс использует ICQ протокол?
 

asm

Пофигист
Кром
Демона это конечно хорошо. Но не думаю что мой хостер захочет его запустить.

Да протокол Oscar
 

Кром

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

Said

Guest
можно использовать [m]ignore_user_abort[/m]

например как это делает
Net_SmartIRC - бот остается висеть и работать и после закрытия окна браузера. Появляется проблема как его убить :)
 

untied

Сдвинутый новичок
А что, если породить дочерний процесс?
На Перле такая штука проходила: Апач просекал только запущенный cgi-скрипт и прибивал именно его. А дочерний процесс оставался висеть.
 

tristram

Guest
Я придумал простое решение. Пишем скрипт, назовем его icqclientd.php. В качестве параметров для запуска - сервер, порт, аська, пароль, файл stdin. Первые 4 параметра для соеденения с сервером. А о последнем расскажу ниже.
Вот что я набросал (не судите строго)
PHP:
<?
set_time_limit(0);
ignore_user_abort(true);
if (!$server = $argv[1]) {$server = "login.icq.com";}
if (!$port = $argv[2]) {$port = "login.icq.com";}
if (!$uin = $argv[3]) {$uin = "656555";}
if (!$pass = $argv[4]) {$pass = "password";}
if (!$file = $argv[5]) {$file = "stdin.txt";}
$icq = new Icq_mega_class($server,$port,$uin,$pass);
$size = $count = 0;
$fp = fopen("icqclientd.log","a");
while(true)
{
 if (filesize($file) > $size)
 {
  $size = filesize($file);
  $fp = explode("\n",file_get_contents($file));
  $fp = array_slice($fp,$count,count($fp));
  foreach($fp as $line)
  {
   if (substr($line,0,4) == "send")
   {
    $send = explode(" ",$line);
    $icq->send($send[1],$send[2]);
   }
   if ($line == "break") {fwrite($fp,"Break!\n"); break;}
   $count++;
  }
 }
}
?>
это набросок. суть я думаю ясна. управляющий скрипт пишет в файл $file команды, скрипт их читает. сейчас думаю о том как получать ответ. возможно в строку ввода надо будет вписать также номер "билетика", т.е. ответ будет записываться в "stdout/".$n.".out", а управляющий будет читать.

-~{}~ 18.02.05 01:02:

P.S. по-хорошему можно сделать через unix-сокеты связь управляющего скрипта и демона. Стучите в 656555.
 

asm

Пофигист
tristram
set_time_limit(0); :)
У меня тоже была такая идея :) нужно попробовать.

Said
Будем смотреть...

-~{}~ 18.02.05 12:13:

Получилось что-то типа:
PHP:
    ignore_user_abort(true);
    set_time_limit(0);
    $icq = new ICQ(UIN, PASSWORD, NICK);
    if($icq->error==''){
        $icq->icq_send_message(150727255, "Service PHP BOT started...");
        $mess = "Message sent";
    }else{
        $mess = $icq->error;
        exit();
    }

    while($icq->socet){
        $query = sql_placeholder('SELECT * FROM ?#TABLE_ICQ ORDER BY id LIMIT 1');
        $mess = sql_result($query);
        if(count($mess)==1){
            if($mess[0]['mess']=='STOP'){
                $icq->icq_send_message(150727255, "Service PHP BOT stop...");
                $icq->icq_exit();
                exit();
            }else{
                $icq->icq_send_message($mess[0]['uin'], $mess[0]['mess']);
            }
            $query = sql_placeholder('DELETE FROM ?#TABLE_ICQ WHERE id=? LIMIT 1', $mess[0]['id']);
            mysql_query($query);
        }
        sleep(10);
    }
-~{}~ 18.02.05 12:14:

Said
Помогло
 

russjura

Guest
Аська и php - штука нужная! Так как насчет класса! ???
Желательно для скачки??
 

asm

Пофигист
BoFFiN
russjura
Да класс сырой еще. !!!Возможно!!! выложу, если доведу до конца.
Пока тестирую.
 

russjura

Guest
А как насчет! помощи?
Коллективно! сможем быстрее! все это написать!
И довести до конца?
 

asm

Пофигист
http://intrigue.ru/icq/icq.phps - Script САБЖ
http://intrigue.ru/icq/icq.class.phps - класс
http://intrigue.ru/icq/ - можно протестить.

Известныуе проблеммы: Бот умирает через определенное время. Скорее всего нужно принимать и разбирать пакеты.
NICK не используется.

-~{}~ 18.02.05 17:45:

Если месаги не отправляются пихайте бота
http://intrigue.ru/icq/icq.php

-~{}~ 18.02.05 18:23:

Предложения и пожелания на мыло или асю.
 
Сверху