SMPP连接

时间:2012-12-01 14:07:23

标签: php data-binding smpp

我正在使用this免费库通过PHP建立SMPP连接。要接收消息,我使用以下代码,例如:

<?php
    $GLOBALS['SMPP_ROOT'] = dirname(__FILE__); // assumes this file is in the root
    require_once $GLOBALS['SMPP_ROOT'].'/protocol/smppclient.class.php';
    require_once $GLOBALS['SMPP_ROOT'].'/transport/tsocket.class.php';

    // Construct transport and client
    $transport = new TSocket('your.smsc.com',2775);
    $transport->setRecvTimeout(60000); // for this example wait up to 60 seconds for data
    $smpp = new SmppClient($transport);

    // Activate binary hex-output of server interaction
    $smpp->debug = true;

    // Open the connection
    $transport->open();
    $smpp->bindReceiver("USERNAME","PASSWORD");

    // Read SMS and output
    $sms = $smpp->readSMS();
    echo "SMS:\n";
    var_dump($sms);

    // Close connection
    $smpp->close();
?>

当我在浏览器窗口中运行脚本并在给定的60秒内从手机发送短信时,它运行得非常好,但我不太明白如何使其工作很长时间。我的意思是,就像在现实生活中的情况一样,它应该在后台运行并在接收短信时触发一些事件。我怎么做?因为现在,我需要每次刷新页面才能收到短信,而且只能运行一次。提前谢谢。

3 个答案:

答案 0 :(得分:2)

如果您的解决方案需要在浏览器中运行,则不应直接从脚本连接到SMPP服务器。这将导致单个用户场景。

你应该在readSMS调用周围进行无限循环,并使其成为一个作为守护进程运行的控制台应用程序。然后将readSMS的结果写入数据库并从Web应用程序中读取。有了这个你可以使用html刷新或一些花哨的ajax查询数据库并呈现传入的短信。

通常SMPP接收器连接在套接字上以阻塞模式运行(无超时),因为要么收到SMS,要么收到enquire_link(需要由enquire_link_resp回答 - 你的库会自动执行此操作)。每当您阅读SMS时,处理它(将其放入数据库中)并再次调用readSMS - 它将一直阻塞,直到下一条SMS进入。

答案 1 :(得分:0)

您可以尝试一下。

<?php
    set_time_limit(0);
    $GLOBALS['SMPP_ROOT'] = dirname(__FILE__); // assumes this file is in the root
    require_once $GLOBALS['SMPP_ROOT'].'/protocol/smppclient.class.php';
    require_once $GLOBALS['SMPP_ROOT'].'/transport/tsocket.class.php';

    // Construct transport and client
    $transport = new TSocket('your.smsc.com',2775);
    $transport->setRecvTimeout(60000); // for this example wait up to 60 seconds for data
    $smpp = new SmppClient($transport);

    // Activate binary hex-output of server interaction
    $smpp->debug = true;

    // Open the connection
    $transport->open();
    $smpp->bindReceiver("USERNAME","PASSWORD");

    while(1) {
        // Read SMS and output
        $sms = $smpp->readSMS();
        echo "SMS:\n";
        var_dump($sms);

    }
    // Close connection
    $smpp->close();
?>

答案 2 :(得分:0)

尝试使用其他库

composer require glushkovds/php-smpp

要接收短信:

<?php
require_once 'vendor/autoload.php';

$service = new \PhpSmpp\Service\Listener(['your.smsc.com'], 'login', 'pass');
$service->listen(function (\PhpSmpp\SMPP\Unit\Sm $sm) {
    if ($sm instanceof \PhpSmpp\Pdu\DeliverSm) {
        var_dump($sm->message);
    }
});