0

在我设法构建了一个由测试实验室 SMSC 组成的 SMS 记录系统后,我目前回到了我的绘图板,该系统具有一个 PHP 脚本,用于将 SMSC 接收到的 SMS 插入/记录到 MySQL 服务器数据库中,该数据库具有下表格式(对不起,凌乱的线条):

|-------------|-------------|---------|
| 信息 | 电话号码 | 消息 |
|-------------|-------------|---------|
| 1 | 12345 | 你好 |
| 2 | 38746 | 世界 |
| 3 | 16375 | 测试 |
| . | ..... | ... |
| . | ..... | ... |
| (自动生成器) | ..... | ... |
|--------------|-------------|----------|

现在我想将这个短信记录系统扩展到一个新的水平——它将能够自动将新收到的短信显示到我现有的网站(也是 PHP 的);代替手动刷新网站,当访问者数量增加时,这会导致巨大的页面开销以及服务器的巨大负载。

当然,网络上已经进行了一些研究,表明 AJAX 与固定的 JS 间隔(比如 5~10 秒)配对可以解决问题,但是当内部没有很多新的传入 SMS 时,这会造成很多冗余那天。

除此之外,长轮询 AJAX 应该可以解决问题,但它会为设置的 Interval 消耗一个线程,这也会降低系统效率。

所以基本上,Comet 是其中一种选择,但不建议在 PHP 平台上实现。

因此,对于我目前在绘图板上的想法,是否有任何输入/想法/建议?

P/S:我真的必须去 node.js 吗?因为我不喜欢像 jQuery 这样的托管 JS,而是编写我自己的函数——如果它足够简单的话!=)

4

2 回答 2

1

Node.js 几乎已成为实时框架的代名词,但也有其他技术的解决方案。对于 PHP 解决方案,您可以查看Ratchet。您可以在我正在策划的实时网络技术指南中找到包含其他语言的更详细列表。

如果您宁愿卸载客户端和服务器之间的持久连接,那么您可以查看我为之工作的实时托管服务,例如Pusher。如果你要这样做,你可以:

将库添加到您的 HTML 并连接到 Pusher

<script src="http://js.pusher.com/1.12/pusher.min.js"></script>
<script>
  var pusher = new Pusher( 'YOUR_APP_KEY' );
  // Additional JavaScript - see below
</script>

订阅短信频道

var smsChannel = pusher.subscribe( 'sms' );

为传入的 SMS 消息绑定到通道上的事件

smsChannel.bind( 'incoming', function(){} );

处理事件并根据需要更新您的应用

smsChannel.bind( 'incoming', function( smsData ) {
  var phoneNo = smsData[ 'PhoneNo' ];
  var msg = smsData[ 'Msg' ];
  // Update the UI as required.
} );

在更新数据库后,您需要在服务器上调用 Pusher。

包括 Pusher 库

// See: http://pusher.com/docs/server_libraries#php
require('Pusher.php');

处理对 PHP 脚本的请求

// I've had to guess a bit here. Hopefully you can convert this to something which meets your requirements/data structures 
$update = $_POST['sms_data'];

$query = sprintf("INSERT INTO updates (Phoneno, Msg) VALUES ('%s', '%s')",
  mysql_real_escape_string( $update['Phoneno'], $update['Msg'] ) );

$result = mysql_query($query);

if($result) {
  // trigger event
}

触发事件

if( $result ) {
  // Use key, secret and id defined from config somewhere
  $pusher = new Pusher( PUSHER_APP_KEY, PUSHER_APP_SECRET, PUSHER_APP_ID);
  $data = array( 'Phoneno' => $update['Phoneno'], 'Msg' => $update['Msg'] );
  $pusher->trigger( 'sms', 'incoming', $data );
}

尽管此示例使用 Pusher,但您将能够使用其他实时 Web 技术遵循类似的模式。

如果您想使用自托管选项,您需要管理由持久连接使用的资源,让服务器立即通知客户端新的 SMS。如果您使用托管服务,则无需担心这一点。

我还写了一篇关于使用 Pusher 和Twilio的教程,它的作用与您在此处尝试实现的非常相似。代码虽然在 Ruby 中。见: http: //www.twilio.com/blog/2012/07/pusher-and-twilio-making-realtime-fuctionality-easy.html

于 2013-01-17T09:29:21.213 回答
0

我试图了解问题并分析您想选择 AJAX 方法,但是如果新传入的消息没有到达太多,您害怕冗余,我可以建议的是:

将您的任务分为两部分,一项任务应检查是否有新消息到达。

如果第一个任务为真,则运行第二个刷新窗口的任务。

这样可以减少冗余。

谢谢

于 2013-01-17T06:32:39.893 回答