我正在使用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秒内从手机发送短信时,它运行得非常好,但我不太明白如何使其工作很长时间。我的意思是,就像在现实生活中的情况一样,它应该在后台运行并在接收短信时触发一些事件。我怎么做?因为现在,我需要每次刷新页面才能收到短信,而且只能运行一次。提前谢谢。
答案 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);
}
});