我有一个学校项目,我需要创建一个基于Web的即时消息系统。
我调查了PHP套接字来完成此任务PHP socket manual
从这些我开始看到一个模式。众所周知,PHP只能运行一次(从上到下),从这些示例中我可以看到while循环是套接字监听新连接的原因。 (意味着php script
永不停止)这些例子回显套接字的输出。
据我所知,如果你只是想要一个普通网站,那就太棒了。
但事实并非如此。我想使用JavaScript来构建这个应用程序,以“询问”套接字是否有任何新消息,然后是否相应地呈现消息。
由于我对PHP套接字非常新,我不确定这是否应该完全由PHP完成,或者是否可以使用JavaScript来监听套接字(通过Ajax),然后将输出打印为JSON
?
答案 0 :(得分:0)
我建议您使用第三方库(好了,再推荐一下这个库:cboden/ratchet)。阅读其教程,您将更清楚地了解如何使用 WebSocket 协议在浏览器和服务器之间进行通信。
服务器完全可以用纯PHP实现!
答案 1 :(得分:0)
通常,对于基于推送的通知,您需要的协议(仅适用于较新的浏览器)是WebSockets。
有各种各样的图书馆和服务可以为您做到这一点:
Pusher是一种在线服务,可以与各种语言集成,为您提供实时功能。 https://pusher.com/
仅限JavaScript,如果您有节点,则应查看socket.io:http://socket.io/
在.NET领域,有一个很棒的http://signalr.net/
的SignalR答案 2 :(得分:0)
不仅可以使用PHP,而且Thruway也很简单。 Thruway是WAMPv2 PHP客户端/路由器,它使用Ratchet进行Websocket传输。 WAMP为您提供Sub / Pub和RPC over WebSockets。
您需要创建一个简单的php路由器并从命令行启动它。像这样:
<?php
require 'vendor\autoload.php';
use Thruway\Peer\Router;
use Thruway\Transport\RatchetTransportProvider;
$router = new Router();
$transportProvider = new RatchetTransportProvider("127.0.0.1", 9090);
$router->addTransportProvider($transportProvider);
然后在客户端上,使用AutobahnJS或如果您使用角度,则可以使用angular-wamp。
如果您仍有疑问,我会做一个简单的聊天示例。
答案 3 :(得分:0)
我实际上使用了基于PHP的websocket并对其进行了调整。如果你愿意,我可以双向工作。您可以将发送到websocket的消息存储在Array中,甚至可以将它们保存到数据库中。客户可以要求新消息:
看看这段代码:
function createConnectionToWebSocket(connection)
{
var host = "ws://[ip of server]:9000/echobot"; // SET THIS TO YOUR SERVER --> 9000 is the port used by websockets.
try {
socket = new WebSocket(host);
console.log('WebSocket - status '+socket.readyState);
socket.onopen = function(msg) {
console.log("Welcome - status "+this.readyState);
};
socket.onmessage = function(msg) {
messageHandlerSocket(msg.data);
};
socket.onclose = function(msg) {
console.log("Disconnected - status "+this.readyState);
if (msg && !msg.wasClean && msg.code == 1006)
{
}
};
socket.onerror = function(msg) {
};
}
catch(ex){
console.log(ex);
}
}
function messageHandlerSocket(msg)
{
//all messages will be send in JSON
var msg = JSON.parse(msg)
//received JSON and check the type. Type is message
switch (msg.type)
{
case "messages" :
//code when the webserver sends back the messages.
break;
}
}
socket.send(JSON.stringify({"type" : "retrievemessages", "user" : user.id}));
Socket.send
允许您将数据发送到PHP服务器。我发送JSON并在服务器上解析它。基于type
参数,我让PHP服务器将数据发送回相应的用户。
我扩展了Github上找到的这个网络服务器。
通过bat文件运行Web服务器。
@ECHO OFF
ECHO STARTING WEBSERVER
ECHO USING [dir to php dir]\php\php.exe
@ECHO OFF
START "WEBSOCKET" /wait /B "[dir to php dir]\php\v5.6\php.exe" -f [path to your websocket.php]