我正在努力让Ratchet与Memcache / Symfony会议合作,但我无法让它工作。
应用程序运行没有任何错误,但我似乎无法获取或设置会话变量。套接字服务器和apache不会通信,即使我在页面本身指定会话处理程序(两端都相同)
服务器:
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use Ratchet\Http\Router;
use Ratchet\Wamp\WampServer;
use Ratchet\Session\SessionProvider;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\Storage\Handler;
use Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag;
use Symfony\Component\HttpFoundation\Session\Storage;
use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
use Ratchet\App;
ini_set('session.cookie_domain', '.domain.com:80');
ini_set('session.save_handler', 'memcache');
ini_set('session.save_path', 'localhost:11211');
session_start();
require dirname(__DIR__) . '/vendor/autoload.php';
$storage = new NativeSessionStorage(array());
$session = new Session($storage, new NamespacedAttributeBag());
$request = Request::createFromGlobals();
$request->setSession($session);
$memcache = new Memcache;
$memcache->connect('localhost', 11211);
$session = new SessionProvider(
new \App\Mire
, new Handler\MemcacheSessionHandler($memcache)
);
$server = new Ratchet\App('www.domain.com', 8081, '0.0.0.0');
$server->route('/sess', $session);
$server->run();
应用:
namespace App;
use Symfony\Component\HttpFoundation\Session\Storage\Handler;
use Ratchet\App;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Ratchet\Session\SessionProvider;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag;
use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
class Mire implements MessageComponentInterface {
protected $clients;
public function __construct() {
$this->clients = array();
}
public function onOpen(\Ratchet\ConnectionInterface $conn) {
$this->clients[$conn->resourceId] = $conn;
echo "New connection! ({$conn->resourceId})\n";
$sessao = new \Symfony\Component\HttpFoundation\Session\Session(new \Symfony\Component\HttpFoundation\Session\Storage\PhpBridgeSessionStorage());
$sessao->start();
echo "io:".$conn->Session->get("io");
}
public function onMessage(ConnectionInterface $from, $msg) {
}
public function onClose(ConnectionInterface $conn) {
unset($this->clients[$conn->resourceId]);
echo "Connection {$conn->resourceId} has disconnected\n";
}
public function onError(ConnectionInterface $conn, \Exception $e) {
echo "An error has occurred: {$e->getMessage()}\n";
$conn->close();
}
}
你能帮我两端沟通吗?
答案 0 :(得分:0)
您需要在同一端口上运行您的web服务器和websocket服务器,否则无法共享cookie(因此您需要在与Web服务器不同的服务器上运行websocket)
答案 1 :(得分:0)
原来我需要做的是在html root上启动app,这似乎不安全。需要进一步阅读。谢谢。