Клиент чата на основе JAXL. Нужна помощь при подключении к Gtalk или другому серверу для тестирования
Я хочу отправить сообщение на чат-серверы на базе XMPP, используя php. Я использую JAXL, который кажется лучшим (из ограниченных) вариантов для чата на чистом PHP-сервере.
Тем не менее, мне еще предстоит установить какое-либо соединение, не говоря уже о том, чтобы отправить сообщение. Мне трудно разобраться, если проблема в моем коде, моем сервере (который является общим сервером, но имеет Cpanel и очень полезный хост) или моими настройками.
Код, который я использую для подключения к GTalk:
$client = new JAXL(array(
'jid' => 'name@gmail.com',
'pass' => 'password',
'host'=> 'talk.google.com',
'port'=> 5222,
'domain'=> 'gmail.com', //unsure if this is the right setting.
'force_tls' => true,
'auth_type' => @$argv[3] ? $argv[3] : 'PLAIN',
));
//
// required XEP's
//
$client->require_xep(array(
'0199' // XMPP Ping
));
//
// add necessary event callbacks here
//
$client->add_cb('on_auth_success', function() {
global $client;
_info("got on_auth_success cb, jid ".$client->full_jid->to_string());
// fetch roster list
$client->get_roster();
// fetch vcard
$client->get_vcard();
// set status
$client->set_status("available!", "dnd", 10);
});
$client->add_cb('on_connect_error', function() {
echo 'Connect Error';
});
$client->add_cb('on_auth_failure', function() {
echo 'Auth Error';
});
$client->add_cb('on_auth_success', function() {
global $client;
echo 'connected';
$client->send_chat_msg('test2@domain.com', 'webtest');
$client->shutdown();
});
//
// finally start configured xmpp stream
//
$client->start(array(
'--with-debug-shell' => true,
'--with-unix-sock' => true
));
echo "done\n";
Запуск php (из браузера) приводит к зависанию сервера. (нет сообщения "сделано", только постоянная загрузка до истечения времени ожидания из браузера)
Логи сервера показывают;
strict mode enabled, adding exception handlers. Set 'strict'=>TRUE inside JAXL config to disable this[0m
error handler called with 8, Undefined index: priv_dir,
А потом много;
unable to connect tcp://talk.google.com:5222 with error no: 110, error str: Connection timed out
Поэтому я был бы признателен за помощь в любом из следующих действий;
- Любые конкретные проблемы с моим кодом
- Любые проблемы с настройками соединения gtalk при запуске
- Альтернативные рекомендации по расследованию этой проблемы.
- Или любой общий совет от людей, которые успешно использовали JAXL.
Спасибо, Томас Вробель
1 ответ
Хорошо, проблема может заключаться в том, что TCP-порт закрыт для вашего хостинга, попробуйте сначала открыть его на своем хостинге, а также попробуйте запустить свой код локально, чтобы увидеть, работает ли он нормально.
Некоторые люди сообщали, что проблема была устранена методом переопределения подключения из файла XMLStream.php этим
/**
* Connect to XMPP Host
*
* @param integer $timeout
* @param boolean $persistent
* @param boolean $sendinit
*/
public function connect($timeout = 30, $persistent = false, $sendinit = true) {
$this->sent_disconnect = false;
$starttime = time();
do {
$this->disconnected = false;
$this->sent_disconnect = false;
if($persistent) {
$conflag = STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT;
} else {
$conflag = STREAM_CLIENT_CONNECT;
}
$conntype = 'tcp';
if($this->use_ssl) $conntype = 'ssl';
$this->log->log("Connecting to $conntype://{$this->host}:{$this->port}");
try {
$this->socket = @stream_socket_client("$conntype://{$this->host}:{$this->port}", $errno, $errstr, $timeout, $conflag);
} catch (Exception $e) {
throw new XMPPHP_Exception($e->getMessage());
}
if(!$this->socket) {
$this->log->log("Could not connect.", XMPPHP_Log::LEVEL_ERROR);
$this->disconnected = true;
# Take it easy for a few seconds
sleep(min($timeout, 5));
}
} while (!$this->socket/* && (time() - $starttime) < $timeout*/);
if ($this->socket) {
stream_set_blocking($this->socket, 0);
if($sendinit) $this->send($this->stream_start);
} else {
throw new XMPPHP_Exception("Could not connect before timeout.");
}
}