我想使用Socket.io和Node.js来做推送通知。最终目标是做一些类似于Stackoverflow对他们的评论所做的事情,以通知人们新的评论。
我的网站是用PHP编写的,运行在EC2实例上的Apache上。我听说Apache不能很好地处理并发,所以我有兴趣使用Node来处理大量的同时持久连接。我想有两种解决方案:
- 将Node放在与Apache相同的实例上,并代理这两台服务器
- 将节点放在单独的实例上
无论哪种情况,我都不知道这两个服务器之间的连接在编程上看起来如何。例如,当WebSockets/Node处理消息的发送/接收时,我需要将这些消息存储在MySQL数据库中,这需要一些PHP代码,是/否?另外,在我的PHP页面上是如何接收消息的?通过$.post
到这样的url,http://mysite/receiver.php
会由我的Apache服务器解析吗?
我很乐意看到评论或代码来帮助我更好地理解这一点。
- 您可以在不同的端口上运行不同的服务器
- 为了让服务器以某种方式进行通信,您可以使用Sessions/MySQL/plant-files/Cache/json/xml
- 您可以将消息存储在任何您想要的地方,对此没有任何限制,存在用于node.js的MySQL模块,存在用于node.js的memcache模块等等,不需要PHP代码,查询数据库是可选的
- PHP页面上的消息是从数据库中提取并呈现的,如果node.js将内容存储在mysql服务器中,则可以使用PHP提取它们,或者临时存储到数组中,并在存储到数据库中时将消息推送回客户端,以便新用户拥有"当前"内容
- 避免使用ajax,因为您可以在需要时通过websocket将数据流式传输到客户端
--已编辑
关于如何在节点http代理旁边使用vhosts的一些附加信息 Timothy Strimple在评论中提供的链接,感谢
在这个问题中可以找到一些MySQL驱动程序node.js有哪些MySQL驱动程序
关于配置端口:
-在apache上,您需要手动编辑httpd.conf来定义默认端口
-在node.js上,事情更简单,您可以在代码中定义端口使用node.js作为一个简单的web服务器
var connect = require('connect');
connect.createServer(
// .. code
).listen(PORT);
希望它能帮助
我需要将这些消息存储在MySQL数据库中,这需要一些PHP代码,是/否?
没有。Node允许您在服务器上编写javavscript,您可以用它做任何与PHP类似的事情,包括连接到MySQL数据库。
您可以在同一台服务器上运行Node和Apache,并使用NGINX在两者之间进行代理,也可以使用Node代理到您的Apache。但不要使用Apache代理到Node,因为这样会损害性能。
以下是一些有望有所帮助的链接:
- Express web框架
- 节点mysql
- NGINX proxy_pass-在端口80上运行NGINX,在具有不同端口的localhost上运行apache和node,使用NGINX在它们之间路由
您还可以使用套接字作为两者之间的直接通信方式使用node.js的net模块和php的socket模块。下面是一个例子。
监听连接的简单节点js服务器
var net = require('net');
var listenport = 3000; // Should be the same as in the php script
// Set up server
var Server = net.createServer(function(Sock) {
console.log('Client Connected.');
Sock.on('data', function(data) {
console.log('Data received: ' + data);
dataobj = JSON.parse(data);
console.log('Item ID: ' + dataobj.itemid);
// and so on
});
Sock.on('end', function() {
console.log('Client Disconnected.');
});
Sock.pipe(Sock);
});
Server.listen(listenport, function() {
console.log('Listening on port ' + listenport);
});
连接到节点实例的简单PHP
<?php
error_reporting(E_ALL);
$port = 3000; // Port the node app listens to
$address = '127.0.0.1'; // IP the node app is on
// Create socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "'n";
}
// Connect to node app
$result = socket_connect($socket, $address, $port);
if ($result === false) {
echo "socket_connect() failed.'nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "'n";
}
// Data we want to send
$data = array('itemid' => '1234567', 'steamid' => '769591951959', 'otherinfo' => 'hi there');
// Prepares to transmit it
$encdata = json_encode($data);
socket_write($socket, $encdata, strlen($encdata));
socket_close($socket);
echo 'Sent data'n';
?>
原始来源:github如何将php连接到节点js