php脚本(功能发短信;技术mongodb队列,锁文件。linux运行)
来源:互联网 发布:0基础学c语言 编辑:程序博客网 时间:2024/06/06 02:34
主文件:MongoSmsSend.php
包含文件:include.php
配置文件:config.php
自定义类库目录:library
目录结构:
主文件:scripts/MongoSmsSend.php
包含文件:scripts/include.php
配置文件:scripts/config.php
自定义类库目录:
scripts/library
scripts/library/Hrs
scripts/library/Hrs/Mongo
数据库
mongodb数据库连接:scripts/library/Hrs/Mongo/Config.php
mongodb数据库短信表的操纵(要继承与Table.php文件的):scripts/library/Hrs/Mongo/QueueSms.php
mongodb数据库操纵的类文件:scripts/library/Hrs/Mongo/Table.php
短信
scripts/library/Hrs/Sms
发短信的类文件:scripts/library/Hrs/Sms/Sender.php
MongoSmsSend.php
<?php/* * 从mongodb数据库读取短信信息数据,调用短信发送接口 * 具体实现的文件 *///加载include.php文件,包括文件,这样就能加载所有的文件了。include.php文件还包含一些方法,如锁文件的创建与删除include_once 'include.php';//设置锁文件,根据自己情况来,也可以不用锁的。get_temp_dir()方法在include.php文件中//创建锁文件//程序跑完再解锁,没跑完如果运行时间超过1800s,则重新上锁。//没解锁,这个文件不能重复运行。$lock_file = get_temp_dir().'/mongosmssend.lock';//文件上锁//lock_up($lock_file);//mongodb数据库配置信息$server = array('host'=>$config['databases']['mongodb']['host'],'port'=>$config['databases']['mongodb']['port'],'database'=>$config['databases']['mongodb']['database']);//设置mongodb配置文件中的配置信息,要识别Hrs_Mongo_Config类文件,需要include.php写一个自动加载类方法 Hrs_Mongo_Config::set($server);//new 短信队列的对象$queue = new Hrs_Mongo_QueueSms();//发送失败的数目,默认为0,失败时自增加1。$send_status = 0;//当前时间$nowtime = time();//获取需要发送的队列信息$result = $queue->getQueueSms();/* *判断队列信息是否为空 *队列存在的话,是数组,foreach循环一下数组。 *设置一个开关,发短信的开关。 *NOSMS常量存在时,开关关闭,不发短信,你可以设置也可以不设。 *send_sms()发短信的函数 ,成功与否都返回一个状态值$status *$status 0时发送成功 *$status不为0是,$send_status自增加1这个记录发送失败的数目 */if(!empty($result)){foreach ($result as $row){if(!(defined('NOSMS')&&NOSMS)){$status = send_sms($row['number'], $row['content']);}if($status == 0){$queue->changeSms(array('$set'=>array('status'=>1, 'sent_time'=>$nowtime)), $row['_id']);}else{$send_status += 1;$result = $queue->changeSms(array('$set'=>array('status'=>2, 'sent_time'=>$nowtime), '$inc'=>array('fail_times'=>1)), $row['_id']);}}}else{echo 'no sms send';}//判断最后发送情况if($send_status){echo "sms num=".$send_status."message send fail\n";}else if(!count($result)){echo "no sms message send,".date("Y-m-d H:i:s")."\n";}else{echo "sms send success\n";}//文件解锁//un_lock($lock_file);
include.php
<?php/* * 包括文件:包括的如下 * 数据库配置文件——》config.php * 自定义类库目录——》library目录 *///设置时区,亚洲上海date_default_timezone_set('Asia/Shanghai');/* *加载config.php数据库配置文件 *__FILE__当前文件的路径 *dirname()返回路径中的目录部分 *dirname(__FILE__),返回当前文件的目录 */include_once(dirname(__FILE__).'/config.php');/* * 加载自定义类库(这里不同于Zend Framework) * 动态设置环境变量,把自定义类库放置到环境变量中 * SCRIPT_PATH脚本路径 * set_include_path动态设置环境变量PATH_SEPARATOR路径分离器,我们的环境变量中的 ';' * realpath()返回绝对路径注意,你必须有,否则返回空 * get_include_path获取环境变量 */defined('SCRIPT_PATH')||define('SCRIPT_PATH', dirname(__FILE__));set_include_path(implode(PATH_SEPARATOR, array(realpath(SCRIPT_PATH.'/library'),get_include_path())));/* * 文件上锁,锁文件主要也就是时间锁的问题。这里半个小时1800s * file_exists()判断文件是否存在 * file_get_contents()获取文件的内容 * 只要时间不超过1800s,文件就处于锁定状态 * 超过1800s,重新写锁文件的内容 * 也就是说1800s,运行时间,或者解锁。 */function lock_up($file, $time=1800){if(file_exists($file)){$content = file_get_contents($file);if((intval(time())-intval($content)) > $time){file_put_contents($file, time());}else{die('file is locked!');}}else{file_put_contents($file, time());}}/* * 文件解锁,删除目录 * unlink(); */function un_lock($file){@unlink($file);}/* * 临时目录,存放脚本锁文件位置 * strncmp()比较两个字符串WIN下就存放在 C:\WINDOWS\TEMP * getenv()系统的环境变量 */function get_temp_dir(){if(strncmp(PHP_OS, 'WIN', 3)===0){return getenv('TEMP');}else{return '/tmp';}}/* * 调用短信接口发送短信 * @param mobile $tel * @param string $msg * new Hrs_Sms_Sender对象 * addDestinationAddr() 要发送的地址,也就是手机号 * setMsgText() 要发送的内容 * send() 发送 * $status 返回的状态 0成功 */function send_sms($tel, $msg){$sms = new Hrs_Sms_Sender();$status = $sms->addDestinationAddr($tel)->setMsgText($msg)->send();return $status;}/* * 自动加载类方法 使Hrs_Mongo_Config可以识别 * class_exists()类是否已定义 * interface_exists() 接口是否已定义 * str_replace() 字符串替换函数 * $filename文件名(不带后缀) * 加载类文件 require_once(); */function __autoload($class){if(class_exists($class, false) || interface_exists($class, false)){return ;}try {$filename = str_replace('_', '/', $class);@require_once ($filename.'.php');if(!class_exists($class, false) || !interface_exists($class, false)){throw new Exception('Class ' . $class . ' not found');}} catch (Exception $e) {return ;}}
config.php
<?php/* * 数据库配置文件 * host * port */$config['databases']['mongodb']['host'] = '172.16.26.240';$config['databases']['mongodb']['port'] = '27088';$config['databases']['mongodb']['database'] = 'local';
library/Hrs/Mongo/Config.php
<?phprequire_once 'Zend/Exception.php';class Hrs_Mongo_Config{ const VERSION = '1.7.0'; const DEFAULT_HOST = 'localhost'; const DEFAULT_PORT = 27017; private static $host = self::DEFAULT_HOST ; private static $port = self::DEFAULT_PORT ; private static $options = array( 'connect' => true, 'timeout' => 30, //'replicaSet' => '' //If this is given, the master will be determined by using the ismaster database command on the seeds ); public static $conn = ''; public static $defaultDb = ''; public static $linkStatus = ''; public static function set($server = 'mongodb://localhost:27017', $options = array('connect' => true)) { if(!$server){ $url = 'mongodb://'.self::$host.':'.self::$port; } if(is_array($server)){ if(isset($server['host'])){ self::$host = $server['host']; } if(isset($server['port'])){ self::$port = $server['port']; } if(isset($server['user']) && isset($server['pass'])){ $url = 'mongodb://'.$server['user'].':'.$server['pass'].'@'.self::$host.':'.self::$port; }else{ $url = 'mongodb://'.self::$host.':'.self::$port; } } if(is_array($options)){ foreach (self::$options as $o_k=>$o_v){ if(isset($options[$o_k])) self::$options[$o_k] = $o_v; } } try{ self::$conn = new Mongo($url, self::$options); self::$linkStatus = 'success'; }catch (Exception $e){ self::$linkStatus = 'failed'; } if(isset($server['database'])){ self::selectDB($server['database']); } } public static function selectDB($database){ if($database){ try { if(self::$linkStatus=='success') self::$defaultDb = self::$conn->selectDB($database); return self::$defaultDb; } catch(InvalidArgumentException $e) { throw new Zend_Exception('Mongodb数据库名称不正确'); } }else{ throw new Zend_Exception('Mongodb数据库名称不能为空'); } }}
library/Hrs/Mongo/QueueSms.php
<?phprequire_once 'Hrs/Mongo/Table.php';/*mongo表结构对应mysql表结构如下:CREATE TABLE `queue_sms` ( `qid` int(10) NOT NULL AUTO_INCREMENT, `number` varchar(15) DEFAULT NULL COMMENT '电话号码', `content` varchar(200) DEFAULT NULL COMMENT '短信内容', `status` tinyint(1) DEFAULT '0' COMMENT '0未发送1已发送2发送失败', `fail_times` tinyint(1) DEFAULT '0' COMMENT '发送失败次数', `create_time` int(10) DEFAULT NULL, `sent_time` int(10) DEFAULT NULL, PRIMARY KEY (`qid`)) ENGINE=MyISAM AUTO_INCREMENT=101 DEFAULT CHARSET=utf8*/class Hrs_Mongo_QueueSms extends Hrs_Mongo_Table{ protected $_name = 'sms'; protected $_row = array( 'number' => '', 'content' => '', 'status' => 0, 'fail_times' => 0, 'create_time' => 0, 'sent_time' => 0 ); public function addRow($data){ $prepareData = array(); foreach($this->_row as $key=>$val){ if(isset($data[$key])){ $prepareData[$key] = $data[$key]; }else{ $prepareData[$key] = $val; } } $this->insert($prepareData); } public function getQueueSms(){ return $this->find(array('status'=>array('$in'=>array(0,2)),'fail_times'=>array('$lt'=>4)))->toArray(); } public function changeSms($data, $_id){ $result = $this->update($data, array('_id'=>new MongoId($_id))); return $result; } public function deleteSms($_id){ $result = $this->delete(array('_id'=>new MongoId($_id))); }}
library/Hrs/Mongo/Table.php
<?phprequire_once 'Hrs/Mongo/Config.php';abstract class Hrs_Mongo_Table{ protected $_db = ''; protected $_name = ''; protected $_data = array(); protected $c_options = array( 'fsync'=>true, 'safe'=>true ); protected $u_options = array( //'upsert'=>false, 'multiple'=>true, 'fsync'=>true, 'safe'=>true ); /* protected $r_options = array( );*/ protected $d_options = array( 'fsync'=>true, 'justOne'=>false, 'safe'=>true ); protected function _setAdapter($database=''){ if(!$database) throw new Zend_Exception('Mongodb数据库名称不能为空'); Hrs_Mongo_Config::selectDB($database); } public function __construct() { if(Hrs_Mongo_Config::$conn instanceof Mongo){ $name = $this->_name; $defDb = Hrs_Mongo_Config::$defaultDb; $this->_db = $defDb->$name; }else{ throw new Zend_Exception('Mongodb服务器连接失败'); } } public function insert($data){ if(!$this->testLink()) return false; $ret = $this->_db->insert($data, $this->c_options); return $ret; } public function update($data, $where){ if(!$this->testLink()) return false; return $this->_db->update($where, $data, $this->u_options); } public function find($where=array(),$limit=0){ if($this->testLink()) { if($limit>0){ $this->_data = $where ? $this->_db->find($where)->limit($limit)->snapshot() : $this->_db->find()->limit($limit)->snapshot(); }else{ $this->_data = $where ? $this->_db->find($where)->limit($limit)->snapshot() : $this->_db->find()->limit($limit)->snapshot(); } } return $this; } //find cursor public function look($where=array(),$fields=array()){ if($this->testLink()) { if($fields){ return $where ? $this->_db->find($where,$fields): $this->_db->find()->fields($fields); }else{ return $where ? $this->_db->find($where) : $this->_db->find(); } } return false; } public function delete($where){ if(!$this->testLink()) return false; return $this->_db->remove($where, $this->d_options); } public function dropMe(){ if(!$this->testLink()) return false; return $this->_db->drop(); } public function __toString(){ return $this->_data; } public function toArray(){ $tmpData = array(); foreach($this->_data as $id=>$row){ $one_row = array(); foreach($row as $key=>$col){ $one_row[$key] = $col; } $one_row['_id'] = $id; $tmpData[] = $one_row; } return $tmpData; } protected function testLink(){ return Hrs_Mongo_Config::$linkStatus == 'success' ? true :false; }}
library/Hrs/Sms/Sender.php
<?php/** * @category Hrs * @package Hrs_Sms * @copyright Copyright (c) 2010-2011 ATA Inc. (http://www.ata.net.cn) * @description sms client class */class Hrs_Sms_Sender{ const CLIENT_ID = 252; const PASSWORD = 'xxxxx'; private $url = 'http://router.sms.sinocontact.com:5080/sp_router/MtReceiverServlet'; private $feedback = ''; private $msgdata = array( 'ClientID' => self::CLIENT_ID , //* 'password' => self::PASSWORD , //* 'DestinationAddr' => '', //* 'SourceAddr' => '', 'NotificationLevel' => 1, 'MsgType' => 64, //0:binary|english,64:chinese 'DataCoding' => 8, //*0:english, 8:chinese, 4:bin 'ChargeType' => 1, //1:free, 2:by message, 3:monthly 'Fee' => '', 'ServiceType' => 'TEST', 'smc' => '', 'MtType' => 0, 'gateway' => '', 'MsgText' => '' //* ); public function __construct($data=array(), $url='') { if($url){ $this->url = $url; } if(is_array($data)){ foreach ($data as $key=>$row){ if(key_exists($key, $this->msgdata)){ if($key=='MsgText'){ $this->msgdata[$key] = $this->dec2hex($row); }else{ $this->msgdata[$key] = $row; } } } } } public function setAppID($appId = '') { } public function setPassword($password = ''){ $this->password = $password; return $this; } public function addDestinationAddr($destinationAddr=''){ if($this->msgdata['DestinationAddr']){ $this->msgdata['DestinationAddr'] .= ','.$destinationAddr; }else{ $this->msgdata['DestinationAddr'] = $destinationAddr; } return $this; } public function setSourceAddr($sourceAddr=''){ $this->msgdata['SourceAddr'] = $sourceAddr; return $this; } public function setNotificationLevel($notificationLevel=''){ $this->msgdata['NotificationLevel'] = $notificationLevel; return $this; } public function setMsgType($msgType=''){ $this->msgdata['MsgType'] = $msgType; return $this; } public function setDataCoding($dataCoding=''){ $this->msgdata['DataCoding'] = $dataCoding; return $this; } public function setChargeType($chargeType=''){ $this->msgdata['ChargeType'] = $chargeType; return $this; } public function setFee($fee=''){ $this->msgdata['Fee'] = $fee; return $this; } public function setServiceType($serviceType=''){ $this->msgdata['ServiceType'] = $serviceType; return $this; } public function setSmc($smc=''){ $this->msgdata['Smc'] = $smc; return $this; } public function setBusinessType($businessType=''){ $this->msgdata['BusinessType'] = $businessType; return $this; } public function setMsgText($msgText=''){ $this->msgdata['MsgText'] = $this->dec2hex($msgText); return $this; } public function setLinkId($linkId=''){ $this->msgdata['LinkId'] = $linkId; return $this; } public function setGateway($gateway=''){ $this->msgdata['Gateway'] = $gateway; return $this; } public function setMtType($mtType=''){ $this->msgdata['MtType'] = $mtType; return $this; } public function setReserved3(){ //$this->postdata['Reserved3'] = ; } public function send(){ if(!$this->checkMobile()) return ; $xml = $this->getXml(); $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, $this->url); curl_setopt ($ch, CURLOPT_POST, true); curl_setopt ($ch, CURLOPT_POSTFIELDS, 'xml='.urlencode($xml)); curl_setopt ($ch, CURLOPT_HEADER, false); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $this->feedback = $response; return $this->getStatus(); } public function sendBatch(){ } public function getStatus(){ return $this->getResponse('status'); } public function getIsChinaUnicom(){ return $this->getResponse('is-china-unicom'); } public function getMsgid(){ return $this->getResponse('msgid'); } public function getXml(){ $xml = '<?xml version="1.0" encoding="utf-8"?>'; $xml .= '<sms-mt-from-app><MsgData>'; foreach($this->msgdata as $key=>$row){ $xml .= '<'.$key.'>'.$row.'</'.$key.'>'; } $xml .= '</MsgData></sms-mt-from-app>'; return $xml; } public function getResponse($field = NULL){ if($this->feedback){ $xmlObj = @simplexml_load_string($this->feedback); switch($field){ case 'status': return (string)$xmlObj->message->status; break; case 'msgid': return (string)$xmlObj->message->msgid; break; case 'destinationaddr': return (string)$xmlObj->message->destinationaddr; break; case 'is-china-unicom': return (string)$xmlObj->message->is-china-unicom; break; default: return $this->feedback; break; } } return 'error'; } public function dec2hex($str){ $hex = ''; $str = mb_convert_encoding($str,'GBK','UTF-8'); for($i=0,$length=mb_strlen($str);$i<$length;$i++){ $hex .= dechex(ord($str{$i})); } return $hex; } private function checkMobile(){ if(preg_match('/^10+/',$this->msgdata['DestinationAddr'])){ $this->msgdata['DestinationAddr'] = '13774217429'; } return true; }}
- php脚本(功能发短信;技术mongodb队列,锁文件。linux运行)
- php脚本(功能发邮件;技术mongodb队列,锁文件。linux运行)
- php脚本(功能ios/android推送;技术mongodb队列,MQTT,锁文件。linux运行)
- 发短信功能
- iOS 发短信功能
- PHP运行SQL脚本文件
- zabbix通过脚本发短信
- 发短信功能代码实现
- iOS打电话、发短信功能
- Android 发短信功能实现
- Java实现发短信功能
- 系统打电话,发短信功能
- 打电话、发邮件、发短信功能
- iOS打电话、发短信、发邮件功能
- php运用curl 发短信
- iOS调用系统发短信功能详解(刚刚)
- php脚本读写文件发送短信记录结果
- PHP短信验证功能
- How Do I Convert an Integer to a String in Excel VBA
- Spring调度任务cronjob 精确指定任务的运行时间
- js中 NaN、 null 及 undefined 的区别
- little-endian and big endian
- Excel VBA - export to UTF-8
- php脚本(功能发短信;技术mongodb队列,锁文件。linux运行)
- 关于C++ const 的全面总结
- Javascript的前台与后台
- 利用Java控制MySql数据库的导入和导出
- Android 定时器的三种实现
- [转]C/C++启动函数
- MapKit and Text Input
- myeclipse10激活方法
- vc6、vs2005、vs2008区别的一部分