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

  • Автор темы Автор темы asm
  • Дата начала Дата начала

asm

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

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

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

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

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

-~{}~ 17.02.05 18:02:

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

Да протокол Oscar
 
Иначе не получится. Если скрипт завершает работу, соединение рвется и сохранить его в какой нибудь сессионной переменной невозможно. :-)))
 
можно использовать [m]ignore_user_abort[/m]

например как это делает
Net_SmartIRC - бот остается висеть и работать и после закрытия окна браузера. Появляется проблема как его убить :)
 
А что, если породить дочерний процесс?
На Перле такая штука проходила: Апач просекал только запущенный cgi-скрипт и прибивал именно его. А дочерний процесс оставался висеть.
 
Я придумал простое решение. Пишем скрипт, назовем его 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.
 
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
Помогло
 
Аська и php - штука нужная! Так как насчет класса! ???
Желательно для скачки??
 
BoFFiN
russjura
Да класс сырой еще. !!!Возможно!!! выложу, если доведу до конца.
Пока тестирую.
 
А как насчет! помощи?
Коллективно! сможем быстрее! все это написать!
И довести до конца?
 
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:

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