создание событий

bratskiy

Новичок
создание событий

Здравствуйте.

Пишу клиент для jabbera (php 4.4.7).
Сразу оговорюсь, что все подобные готовые классы - jabber клиенты, которые можно найти в интернете мне не подходят, т.к они не работают и не удовлетворяют специфике моей задачи.

Принимать сообщения уже получается, но с отправкой возникает проблема.
Так как для работы с сокетами через php скрипты, обязательно нужно организовывать бесконечный цикл
(while(true) { читаем сокет }), не понятно как можно обратится внутрь этого цикла, в случае если хочется отправить сообщение.

структура класса примерно такая

class jabberclient
var $........
function ........

function run() ---В эту функцию надо передать данные из вне
{
$this->connect();
$this->autorize();
while(true)
{
if(false === ($s_answ = socket_read($this->socket, 2048)))
{
print("can not get answer from server".socket_strerror(socket_last_error())."\n\r");
break;
}
print("Server: ".$s_answ."\n\r");
}
}
На php пишу не так давно, и насколько знаю на нём нельзя создавать пользовательские события и их обработчики,
Постоянное внутри цикла считывать файлик, в который можно записать что-нибудь в случае отправки сообщения как то не очень охота. Может есть какой другой способ?
 

Wicked

Новичок
На php пишу не так давно, и насколько знаю на нём нельзя создавать пользовательские события и их обработчики,
более того, в рамках ПХП это звучит просто глупо.
 

bratskiy

Новичок
Тогда вопрос по поводу шаредмемори:
в функцию shmop_open, первым параметром нужно передать адрес куда надо писать.
Этот адрес же от балды не придумаешь, вдруг он какими то другими процессами используется. Ещё он должен быть заранее известен, т.к. его будет использовать экземпляр класса и сторонний скрипт, который будет отправлять сообщения. Проще тогда файл всё время считывать, ну или хотя бы с какой-то задержкой
 

Alexandre

PHPПенсионер
bratskiy, событий в пхп нет, но можно сделать эмуляцию события. Надо только понять, чего действительно ты хочешь и зачем тебе это надо. Есть паттерны, которые могут эмулировать события.
 

bratskiy

Новичок
Мне надо, чтобы посетитель сайта заполнив форму, мог отправить сообщение и чтобы это сообщение мог получить пользователь у которого установлен desktop jabber клиент (Psi). Кроме того посетитель должен иметь возможность получить ответ прямо на сайте в реальном времени (по принципу чата).
 

Alexandre

PHPПенсионер
bratskiy я не в курсе, что такое desktop jabber клиент (Psi), но думаю, что можно это вполне возможно.
Кроме того посетитель должен иметь возможность получить ответ прямо на сайте в реальном времени
делается через опрос яваскриптом по таймауту некоторого скрипта на пхп (который и реализует функцию desktop jabber клиент ) или по типу аджакс.
 

bratskiy

Новичок
desktop jabber клиент (Psi) - это обычная программка, которая, ставится на компьютер (как аська).
Понятно, что можно через javascript вызывать php'шные функции (ajax), но как можно обратится к методам уже загруженного в память объекта? По ходу ни как
 

Vallar_ultra

Любитель выпить :)
bratskiy

> но как можно обратится к методам уже загруженного в память объекта?

Тебе надо чтобы объекты при каждом обновлении не инстанцировались заново, так?
 

bratskiy

Новичок
Попробовал сериализовать объект, потом unserialize в скрипте, который должен отправлять сообщения. Все свойства класса передались в новый объект, а сокет, который тоже у меня как свойство, почему-то не передался, и из-за этого отправка не работает
 

Vallar_ultra

Любитель выпить :)
bratskiy

как работает serialize лень прочитать было?
в качестве наглядного пособия:
PHP:
class A
{
	var $a;
	var $b;
	function __construct()
	{
		$this->a = 5;
		$this->b = fopen("http://www.ya.ru", "r");
	}
}

$x = new A();
var_dump($x->a);
var_dump($x->b);
file_put_contents('/tmp/test.txt', serialize($x));

echo "\n\n";

$str = file_get_contents('/tmp/test.txt');
$x = unserialize($str);
var_dump($x->a);
var_dump($x->b);
а тепер вопрос на миллион долларов: тебе надо чтобы кешировалсь СОЕДИНЕНИЕ?

-~{}~ 17.07.07 05:58:

Krishna

Видать боязнь кривых хост-площадок дает о себе знать.... хотя может и нетрадиционная ориентация ))
 

bratskiy

Новичок
Еще один некрофил...
Мнение свое, мог бы и не высказывать, ни чем дельным помочь ты всё равно не можешь, а засорять топик тупыми высказываниями не стоит.

Ты, походу, относишься к такому типу пользователей форума, которые на вопрос типа: "Как вытащить запись из MySQL", начинаешь говорить о человеке что он тупой и чтоб читал мануал, а если у человека возникает нетривиальная задачка, сразу писать "ну ты, блин, извращенец".
В общем, бесполезный такой человечек, которому не чем занятся
 

Vallar_ultra

Любитель выпить :)
bratskiy
Ну во-первых оффтопик ты сейчас сам правоцируешь

Во-вторых "и чтоб читал мануал" - СУПЕР правильный совет.

В-третьих "ли у человека возникает нетривиальная задачка" - в каком месте ты тут узрел нетривиальную задачу??

Если тебе дали пример, и ты не понял. Перед тем как решать задачу не удосужился прочитать хоть малую часть того, что написано о принципах работы ПоХаПе в частности и скриптовых языков вобщем - то это не проблемы участников форума.

Готового решения тебе никто не даст. Принцип работы следующий:

Кешируешь коллекцию сообщений в сериализованом виде а соединение поднимаешь ПРИНУДИТЕЛЬНО при каждом запросе на апдейт коллекции(в твоем случае - опрос сокета). Все понятно или есть вопросы?
 

bratskiy

Новичок
Vallar_ultra

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

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

Спасибо, что привёл мне кусочек кода, но до твоего сообщения он у меня и был, и почти в таком же виде (в мануале нашёл), но... сокет почему-то не передаётся, хотя может я где-то прокосячил, надо ещё несколько раз перепроверить
 

Vallar_ultra

Любитель выпить :)
bratskiy
> ни коем образом не предназначен для реализовации подобных задач

Все у него с подобными задачами хорошо.

>сокет почему-то не передаётся

Ты либо не понял сути примера, либо не читал мой предыдущий пост. Пока будем считать что раннее утро не способствует концентрации.
 

bratskiy

Новичок
Vallar_ultra
Хорошо, признаюсь, мне нужна помощь:
Кешируешь коллекцию сообщений в сериализованом виде а соединение поднимаешь ПРИНУДИТЕЛЬНО при каждом запросе на апдейт коллекции(в твоем случае - опрос сокета). Все понятно или есть вопросы?
Я не совсем понял, что имелось ввиду и как это реализовывается.

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

<?
//-------скрипт-демон------
include("jabberclient.php");
$cl = new jabberclient;
$cl->init($msges);
$cl->stream_id=$cl->connect();
var_dump($cl->socket);
$s = serialize($cl);
$fp = fopen("store", "w");
fputs($fp, $s);
fclose($fp);
$cl->authorize();
$cl->run();
$cl->disconnect();
?>

<?
//-------скрипт, отправляющий сообщения-------
include("jabberclient.php");

if(isset($_POST["f_msg"]))
{
$s = implode("", @file("store"));
$jcl = unserialize($s);
var_dump($this->socket);

$message = '<message type="chat" id="aab8a" to="[email protected]"><body>'.$_POST["f_msg"].'</body><x xmlns="jabber:x:event"><composing/></x></message>';
$jcl->send_message($message);
// socket_write($jcl->socket, $messsage);
// $jcl->test();
echo "Сообщение отправлено";
}
else
{
echo '<form action="'.$_SERVER["PHP_SELF"].'" method="post">';
echo '<textarea name="f_msg"></textarea><br>';
echo '<input type="submit" value="Отправить">';
echo '</form>';
}
?>
 

Vallar_ultra

Любитель выпить :)
ужас какой!

Еще раз объясняю. На каждую чат-сессию создаешь объект, в который пишешь коллекцию(массивчик) всех сообщений в данной чат-сессии. При добавлении нового сообщения - просто добавляешь в коллекцию, а не пересобираешь ее заново.

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

добавление сообщение: соединение, авторизация, отправка в сокет, добавление в коллекцию, смерть(можно с перерисовкой чата). Все.

Вот тебе принцип работы таких приложений.
 
Сверху