php开发的web网站,怎么融合php发送短信代码手机短信的功能

2010年3月 PHP大版内专家分月排行榜第三2005年4月 PHP大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。&&&&&& 在项目中使用过发短信的功能,但那个由于公司内部的限制很麻烦,今天在网上找到一个简单的,闲来无事就把它记录如下:
&&&&&& 本程序是通过使用中国网建提供的SMS短信平台实现的(该平台目前为注册用户提供5条免费短信,3条免费彩信,这足够用于我们测试用了。在使用前需要注册,注册地址为),下面是程序源码:
* @Author dengsilinming
package com.dengsilinming.
import java.io.IOE
import mons.httpclient.H
import mons.httpclient.HttpC
import mons.httpclient.HttpE
import mons.httpclient.NameValueP
import mons.httpclient.methods.PostM
public class SendMsg_webchinese {
* @author dengsilinming
* @date Sep 18, 2012
* @time 9:38:25 AM
* @param args
* @throws IOException
* @throws HttpException
* @description
public static void main(String[] args) throws HttpException, IOException {
HttpClient client = new HttpClient();
PostMethod post = new PostMethod(&http://gbk.&);
// PostMethod post = new PostMethod(&/web_api/&);
post.addRequestHeader(&Content-Type&,
&application/x-www-form-charset=gbk&);// 在头文件中设置转码
NameValuePair[] data = { new NameValuePair(&Uid&, &dengsilinming&),// 注册的用户名
new NameValuePair(&Key&, &72da78da5ff54f450505&),// 注册成功后,登录网站后得到的密钥
new NameValuePair(&smsMob&, &&),// 手机号码
new NameValuePair(&smsText&, &这是专用于测试的信息,能否正常发短信呢?&) };// 短信内容
post.setRequestBody(data);
client.executeMethod(post);
Header[] headers = post.getResponseHeaders();
int statusCode = post.getStatusCode();
System.out.println(&statusCode:& + statusCode);
for (Header h : headers) {
System.out.println(&---& + h.toString());
String result = new String(post.getResponseBodyAsString().getBytes(
System.out.println(result);
需要用到的jar包共三个:
以下内容摘自&:
GBK编码发送接口地址:
http://gbk./?Uid=本站用户名&Key=接口安全密码&smsMob=手机号码&smsText=短信内容
UTF-8编码发送接口地址:
http://utf8./?Uid=本站用户名&Key=接口安全密码&smsMob=手机号码&smsText=短信内容
获取短信数量接口地址(UTF8):
/web_api/SMS/?Action=SMS_Num&Uid=本站用户名&Key=接口安全密
获取短信数量接口地址(GBK):
/web_api/SMS/GBK/?Action=SMS_Num&Uid=本站用户名&Key=接口安全密码
提示:HTTP调用URL接口时, 参数值必须URL编码后再调用
Gbk编码Url
http://gbk./
Utf-8编码Url
http://utf8./
本站用户名(如您无本站用户名请先注册)
注册时填写的接口安全密码(可到用户平台修改安全密码)
目的手机号码(多个手机号请用半角逗号隔开)
短信内容,最多支持300个字,普通短信70个字/条,长短信64个字/条计费
多个手机号请用半角,隔开,如:,, 一次最多对50个手机发送
短信内容支持长短信,最多300个字,普通短信70个字/条,长短信64个字/条计费
短信发送后返回值
没有该用户账户
密钥不正确(不是用户密码)
短信数量不足
该用户被禁用
短信内容出现非法字符
手机号格式不正确
手机号码为空
短信内容为空
短信发送数量
下面是不同的语言调用SMS接口的简单demo:
1. ASP 调用例子
'输入url目标网页地址,返回值getHTTPPage是目标网页的html代码
function getHTTPPage(url)
set Http=server.createobject(&MSXML2.XMLHTTP&)
Http.open &GET&,url,false
Http.send()
if Http.readystate&&4 then
exit function
getHTTPPage=bytesToBSTR(Http.responseBody,&GB2312&)
set http=nothing
if err.number&&0 then err.Clear
end function
Function BytesToBstr(body,Cset)
dim objstream
set objstream = Server.CreateObject(&adodb.stream&)
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
End Function
'自已组合一下提交的URL加入自己的账号和密码
sms_url=&/web_api/?Uid=账号&Key=接口密钥&smsMob=手机号码&smsText=短信内容&
response.write getHTTPPage(sms_url)
//需要用到的命名空间
using System.N
using System.IO;
using System.T
//调用时只需要把拼成的URL传给该函数即可。判断返回值即可
public string GetHtmlFromUrl(string url)
string strRet =
if(url==null || url.Trim().ToString()==&&)
return strR
string targeturl = url.Trim().ToString();
HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl);
hr.UserAgent = &Mozilla/4.0 ( MSIE 6.0; Windows NT 5.1)&;
hr.Method = &GET&;
hr.Timeout = 30 * 60 * 1000;
WebResponse hs = hr.GetResponse();
Stream sr = hs.GetResponseStream();
StreamReader ser = new StreamReader(sr, Encoding.Default);
strRet = ser.ReadToEnd();
catch (Exception ex)
return strR
3.JAVA调用
import java.io.UnsupportedEncodingE
import mons.httpclient.H
import mons.httpclient.HttpC
import mons.httpclient.NameValueP
import mons.httpclient.methods.PostM
public class SendMsg_webchinese {
public static void main(String[] args)throws Exception
HttpClient client = new HttpClient();
PostMethod post = new PostMethod(&http://gbk.&);
post.addRequestHeader(&Content-Type&,&application/x-www-form-charset=gbk&);//在头文件中设置转码
NameValuePair[] data ={ new NameValuePair(&Uid&, &本站用户名&),new NameValuePair(&Key&, &接口安全密码&),new NameValuePair(&smsMob&,&手机号码&),new NameValuePair(&smsText&,&短信内容&)};
post.setRequestBody(data);
client.executeMethod(post);
Header[] headers = post.getResponseHeaders();
int statusCode = post.getStatusCode();
System.out.println(&statusCode:&+statusCode);
for(Header h : headers)
System.out.println(h.toString());
String result = new String(post.getResponseBodyAsString().getBytes(&gbk&));
System.out.println(result);
post.releaseConnection();
$url='/web_api/?Uid=账号&Key=接口密钥&smsMob=手机号码&smsText=短信内容';
echo Get($url);
function Get($url)
if(function_exists('file_get_contents'))
$file_contents = file_get_contents($url);
$ch = curl_init();
$timeout = 5;
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
return $file_
'调用发送短信,NoList接收号码.多个之间用,分开,Memo内容70字
Public Function SendSMS(ByVal NoList As String, ByVal Memo As String) As String
Dim Url As String = &/web_api/?Uid=账号&Key=接口密钥&smsMob=手机号码&smsText=短信内容&
Dim webClient As New Net.WebClient()
'Dim responseData As Byte() =
Dim srcString As String = webClient.DownloadString(Url)
Return srcString
Return &-444&
End Function
经过测试上面java源码是能够发送成功的,其它语言的没有测试。如果大家有更好的发送短信的方法请告之,谢谢!
转载请说明出自
本文已收录于以下专栏:
相关文章推荐
今天闲来无事,在微博上看到一个关于用java实现的一个发送手机短信的程序,看了看,写的不太相信,闲的没事,把他整理下来,以后可能用得着
JAVA发送手机短信,流传有几种方法:(1)使用webserv...
Java、android使用的短信SDK是多线程:
:8061/webservice.asmx
其他编程语言使用的是下面接口,希望注意。
Java开发应用发短信
java实现短信验证码功能
今天给大家介绍一款253云通讯平台 首先进入他的253官网注册下面我已图文的方式来介绍
登录到此界面 下载官方的JDK
新用户网站内会送几十条短信 ...
由于最近使用云信添加短信接入功能,记录一下一些点避免时间久了忘记。发短信package com.lincoln.Uimport com.alibaba.fastjson.JSON;
使用Java实现短信发送
1.在中国网建平台注册账号
注册完成后会免费赠送5条短信和3条彩信
.cn/reg.shtml
2.建立JAVA...
接上文,验证码生成后,实现短信发送
第一步:需要加载短信发送的一些参数,短信发送需要借助运营商或者是短信平台的提供方的请求接口,其实就是我们去调短信运营商的发短信接口
该地址也是由运营商提...
今天看到了一个需求,需要做一个发送短信的功能,网上找了找,大概有这几种方法:(1)使用webservice接口发送手机短信,这个可以使用sina提供的webservice进行发送,但是需要进行注册;(...
整体流程:
客户填入手机号,通过客户端点击获取验证码按钮,验证手机号是否有效(这只在客户端验证手机号),是则浏览器发送ajax请求后台,客户端开始倒计时60s,否则返回;
服务器,验证手机号是否被注册...
今天来新公司时,新公司都用的是jdk1.5,让我装jdk1.5,而我电脑之前装的是jdk1.6,但是当我把jdk1.5装好后,path路径也改成了jdk1.5的路径了,但是在dos下敲下Java -v...
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)2954人阅读
短信接口(9)
一、群发短信mt
是否必须&&&
软件序列号
格式XXX-XXX-XXX-XXXXX
md5(sn+password) 32位大写密文
必填(支持10000个手机号,建议&=5000)多个英文逗号隔开
支持长短信(详细请看长短信扣费说明)
例如:123(默认置空)
例如: 16:27:03(非定时置空)
最长18位,只能是数字或者 字母 或者数字+字母的组合
函数返回值:String(唯一标识,即当前发送短信批次的唯一标识,和rrid对应,如为空则返回系统生成的rrid),此方法推荐用于大量群发.内容相同手机号多个的情况。
接口地址:
SN= SDK-SSD-010-00001
PWD=3B5D3CC1DE0
Mobile:139***404,138***213…………….
Content:测试
XML格式:
具体函数PHP实现:
//改demo的功能是群发短信和发单条短信。(传一个手机号就是发单条,多个手机号既是群发)
//您把序列号和密码还有手机号,填上,直接运行就可以了
//如果您的系统是utf-8,请转成GB2312 后,再提交、
//请参考 'content'=&iconv( &UTF-8&, &gb2312//IGNORE& ,'您好测试短信[XXX公司]'),//短信内容
$flag = 0;
//要post的数据
$argv = array(
'sn'=&'SDK-SSD-010-00009', ////替换成您自己的序列号
'pwd'=&strtoupper(md5('SDK-SSD-010-00001'.'XXX')), //此处密码需要加密 加密方式为 md5(sn+password) 32位大写
'mobile'=&'',//手机号 多个用英文的逗号隔开 post理论没有长度限制.推荐群发一次小于等于10000个手机号
'content'=&'用户您好,您的校验码是123456,十分钟输入有效。[雷雨科技]',//短信内容
'ext'=&'',
'stime'=&'',//定时时间 格式为 11:09:21
'rrid'=&''
//构造要post的字符串
foreach ($argv as $key=&$value)
if ($flag!=0)
$params .= &&&;
$flag = 1;
$params.= $key.&=&; $params.= urlencode($value);
$flag = 1;
$length = strlen($params);
//创建socket连接
$fp = fsockopen(&&,8060,$errno,$errstr,10) or exit($errstr.&---&&.$errno);
//构造post请求的头
$header = &POST /webservice.asmx/mt HTTP/1.1\r\n&;
$header .= &Host:\r\n&;
$header .= &Content-Type: application/x-www-form-urlencoded\r\n&;
$header .= &Content-Length: &.$length.&\r\n&;
$header .= &Connection: Close\r\n\r\n&;
//添加post的字符串
$header .= $params.&\r\n&;
//发送post的数据
fputs($fp,$header);
$inheader = 1;
while (!feof($fp))
$line = fgets($fp,1024); //去除请求包的头只显示页面的返回数据
if ($inheader && ($line == &\n& || $line == &\r\n&))
$inheader = 0;
if ($inheader == 0)
//&string xmlns=&http://tempuri.org/&&-5&/string&
$line=str_replace(&&string xmlns=\&http://tempuri.org/\&&&,&&,$line);
$line=str_replace(&&/string&&,&&,$line);
$result=explode(&-&,$line);
// echo $line.&-------------&;
if(count($result)&1)
echo '发送失败返回值为:'.$line.'。请查看webservice返回值对照表';
echo '发送成功 返回值为:'.$
二、webservice返回集合对照表:
返回值
返回值说明
帐号/密码不正确
1.序列号未注册2.密码加密不正确3.密码已被修改4.序列号已注销
余额不足支持本次发送(或者修改密码长度不正确)
余额不足(或者修改密码长度不在6位到10位之间)
数据格式错误
只能自行调试了。或与技术支持联系
看参数传的是否均正常,请调试程序查看各参数
该序列号是否已经开通了调用该方法的权限
流量控制错误
扩展码权限错误
该序列号是否已经开通了扩展子号的权限,把ext这个参数置空。
内容长度长
单字节不能超过1000个字符,双字节不能超过500个字符
内部数据库错误
序列号状态错误
序列号是否被禁用
服务器写文件失败
如发送彩信仅限于SDK3
禁止同时使用多个接口地址
每个序列号提交只能使用一个接口地址
相同手机号,相同内容重复提交
Ip鉴权失败
提交的IP不是所绑定的IP
缓存无此序列号信息
序列号为空,参数错误
序列号格式错误,参数错误
密码为空,参数错误
手机号码为空,参数错误
内容为空,参数错误
ext长度大于9,参数错误
参数错误 扩展码非数字&
参数错误 定时时间非日期格式
rrid长度大于18,参数错误&
参数错误 rrid非数字
参数错误 内容编码不符合规范
手机个数与内容个数不匹配
扩展个数与手机个数数
rrid个数与手机个数不一致
注:以上返回值针对个别方法.请具体参看每个用到方法的详细说明。
三、附加说明:
1.接口地址:
常用接口地址: (一般调用)
多线程接口地址: (java、andriod使用)
2.其它说明:
(1)开发使用的帐号必须为SDK开头,如SDK-SSD-010-00001,帐号第一次需要调用Register方法注册一次.仅需注册一次即可,信息必须真实
(2)UnRegister与Register配合使用, 连续使用不得超过10次/天;
(3)群发推荐使用接口方法 mt或者mdSmsSend (仅方法名不同);
3. 郑重声明:
(1)禁止相同的内容多个手机号连续一条一条提交. 否则禁用帐号,由此带来损失由客户自行负责.
(2)请客户提供外网服务器IP以便于绑定IP发送,提高账号的安全性!
(3)在程序里最好有配置文件,程序自动判断当某个接口连接超时提交速度变慢时.程序可以自动切换其它的接口以下是推荐的几个服务器,仅接口地址不同而已.方法全部相同;
这些地址都是标准的webservice地址,C#,Java客户可以按照自己熟悉的方式去解析String&&&
地址1:?wsdl
四、示例Demo源代码下载:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:16178次
排名:千里之外
原创:20篇
(1)(6)(14)浅谈 PHP 与手机 APP 开发(API 接口开发) - ThinkPHP框架
MySQL://Nginx:PHP@Linux&=&&开发交流Q群:推荐阅读: 更深入了解API开发
这个帖子写给不太了解PHP与API开发的人
一、先简单回答两个问题:
1、PHP 可以开发客户端?
答:不可以,因为PHP是脚本语言,是负责完成 B/S架构 或 C/S架构 的S部分,即:服务端的开发。(别去纠结 GTK、WinBinder)
2、为什么选择 PHP 作为开发服务端的首选?
答:跨平台(可以运行在UNIX、LINUX、WINDOWS、Mac OS下)、低消耗(PHP消耗相当少的系统资源)、运行效率高(相对而言)、MySQL的完美搭档,本身是免费开源的,......
二、如何使用 PHP 开发 API(Application Programming Interface,应用程序编程接口) 呢?
做过 API 的人应该了解,其实开发 API 比开发 WEB 更简洁,但可能逻辑更复杂,因为 API 其实就是数据输出,不用呈现页面,所以也就不存在 MVC(API 只有 M 和 C),
1、和 WEB 开发一样,首先需要一些相关的参数,这些参数,都会由客户端传过来,也许是 GET 也许是 POST,这个需要开发团队相互之间约定好,或者制定统一规范。
2、有了参数,根据应用需求,完成数据处理,例如:任务进度更新、APP内购、一局游戏结束数据提交等等
3、数据逻辑处理完之后,返回客户端所需要用到的相关数据,例如:任务状态、内购结果、玩家信息等等
数据怎么返给客户端?
直接输出的形式,如:JSON、xml、TEXT 等等。
4、客户端获取到你返回的数据后,在客户端本地和用户进行交互
临时写的一个简单 API 例子:&?php
$output&=&array();
$a&=&@$_GET['a']&?&$_GET['a']&:&'';
$uid&=&@$_GET['uid']&?&$_GET['uid']&:&0;
if&(empty($a))&{
&&&&$output&=&array('data'=&NULL,&'info'=&'坑爹啊!',&'code'=&-201);
&&&&exit(json_encode($output));
if&($a&==&'get_users')&{
&&&&//检查用户
&&&&if&($uid&==&0)&{
&&&&&&&&$output&=&array('data'=&NULL,&'info'=&'The&uid&is&null!',&'code'=&-401);
&&&&&&&&exit(json_encode($output));
&&&&//假设&$mysql&是数据库
&&&&$mysql&=&array(
&&&&&&&&10001&=&&array(
&&&&&&&&&&&&'uid'=&10001,
&&&&&&&&&&&&'vip'=&5,
&&&&&&&&&&&&'nickname'&=&&'Shine&X',
&&&&&&&&&&&&'email'=&'',
&&&&&&&&&&&&'qq'=&979137,
&&&&&&&&&&&&'gold'=&1500,
&&&&&&&&&&&&'powerplay'=&&array('2xp'=&12,'gem'=&12,'bingo'=&5,'keys'=&5,'chest'=&8),
&&&&&&&&&&&&'gems'=&&array('red'=&13,'green'=&3,'blue'=&8,'yellow'=&17),
&&&&&&&&&&&&'ctime'=&,
&&&&&&&&&&&&'lastLogin'=&,
&&&&&&&&&&&&'level'=&19,
&&&&&&&&&&&&'exp'=&16758,
&&&&&&&&),
&&&&&&&&10002&=&&array(
&&&&&&&&&&&&'uid'=&10002,
&&&&&&&&&&&&'vip'=&50,
&&&&&&&&&&&&'nickname'&=&&'elva',
&&&&&&&&&&&&'email'=&'',
&&&&&&&&&&&&'qq'=&NULL,
&&&&&&&&&&&&'gold'=&14320,
&&&&&&&&&&&&'powerplay'=&&array('2xp'=&1,'gem'=&120,'bingo'=&51,'keys'=&5,'chest'=&8),
&&&&&&&&&&&&'gems'=&&array('red'=&13,'green'=&3,'blue'=&8,'yellow'=&17),
&&&&&&&&&&&&'ctime'=&,
&&&&&&&&&&&&'lastLogin'=&,
&&&&&&&&&&&&'level'=&112,
&&&&&&&&&&&&'exp'=&167588,
&&&&&&&&),
&&&&&&&&10003&=&&array(
&&&&&&&&&&&&'uid'&=&&10003,
&&&&&&&&&&&&'vip'&=&&5,
&&&&&&&&&&&&'nickname'&=&&'Lily',
&&&&&&&&&&&&'email'&=&&'',
&&&&&&&&&&&&'qq'&=&&NULL,
&&&&&&&&&&&&'gold'&=&&1541,
&&&&&&&&&&&&'powerplay'=&&array('2xp'=&2,'gem'=&112,'bingo'=&4,'keys'=&7,'chest'=&8),
&&&&&&&&&&&&'gems'&=&&array('red'=&13,'green'=&3,'blue'=&9,'yellow'=&7),
&&&&&&&&&&&&'ctime'&=&&,
&&&&&&&&&&&&'lastLogin'=&&,
&&&&&&&&&&&&'level'&=&&10,
&&&&&&&&&&&&'exp'&=&&1758,
&&&&&&&&),
&&&&$uidArr&=&array(,10003);
&&&&if&(in_array($uid,&$uidArr,&true))&{
&&&&&&&&$output&=&array('data'&=&&NULL,&'info'=&'The&user&does&not&exist!',&'code'&=&&-402);
&&&&&&&&exit(json_encode($output));
&&&&//查询数据库
&&&&$userInfo&=&$mysql[$uid];
&&&&//输出数据
&&&&$output&=&array(
&&&&&&&&'data'&=&&array(
&&&&&&&&&&&&'userInfo'&=&&$userInfo,
&&&&&&&&&&&&'isLogin'&=&&true,//是否首次登陆
&&&&&&&&&&&&'unread'&=&&4,//未读消息数量
&&&&&&&&&&&&'untask'&=&&3,//未完成任务
&&&&&&&&),&
&&&&&&&&'info'&=&&'Here&is&the&message&which,&commonly&used&in&popup&window',&//消息提示,客户端常会用此作为给弹窗信息。
&&&&&&&&'code'&=&&200,&//成功与失败的代码,一般都是正数或者负数
&&&&exit(json_encode($output));
}&elseif&($a&==&'get_games_result')&{
&&&&die('您正在调&get_games_result&接口!');
}&elseif&($a&==&'upload_avatars')&{
&&&&//....
&&&&die('您正在调&upload_avatars&接口!');
}点击测试(对于客户端而言,也是直接调用这样的地址):
三、实际项目中,我们在开发 API 应该注意的几个事项(仅供参考):
1、单文件实现多接口的形式有很多种,例如:if..elseif.. 或 switch 或 动态方法 (也就是TP的这种访问函数体的形式)
2、对于数据的输出最好用json,json具有相当强大的跨平台性,市场上各大主流编程语言都支持json解析,json正在逐步取代xml,成为网络数据的通用格式
3、接口安全,一定要增加接口验证。例如,客户端和服务端针对不同接口统一做好加密方式,服务端在对于每次接口需要都要进行验证。以保证防止接口被恶意刷新或黑客恶意调用,尤其是大型商业应用。
4、对于线上的 API 必须保证所有接口正常且关闭所有的错误信息 =& error_reporting(0),在输出JSON 时,不能有任何其它输出,否则,客户端将解析数据失败,直接 Crash!
5、开发 API 和 WEB 有一定的区别,如果是 WEB 的话,可能代码出错了,不会导致特别严重的错误,也许只是导致数据写入和查询失败,也许导致 WEB 的某个部分错位或乱码。但如果是 API,直接 Crash!
6、做接口开发,不建议使用框架开发,原因概括起来有两点(其实我有点冒风险的,本人也是 TPer 一枚,毕竟这是TP的官网):
  1)客户端一般对服务端的响应速度有极高要求,因此,使用最原生态的 PHP 完成接口开发,是最高效的,假如用到了框架,还需要加载各种不需要多余的文件,就好比夏天穿了件冬天的衣服。试想,你在玩手机的时候,使用一个应用随便一个操作,等半天才有动静,你受的了吗?
  2)就是上面第4点提到的,框架对于WEB开发,是件很幸福的事,但对于 API 而言,你实在不敢想象它会给你出什么岔子!最后你将痛苦不堪~~因为很多框架都是为 WEB 诞生的(我也很期待有一天能看到专门为开发 API 而生的框架或者扩展)
  这个也有人纠结,接口效率与稳定性,还得看编码的人,有的人可能写的还不如框架跑的快,也有人觉得用框架没什么问题,这里只是建议,关键看自己的实际情况,同时建议代码上线前压测一下
  说到这,不得不说扯一下,腾讯微博淘宝等开放平台。其实那些开放平台,所谓的开放,就是给你提供一个这样的接口,你根据他们提供的技术文档,按他们制定的格式和要求,调它们提供的接口文件(一般都是返回JSON或者xml),你就可以获取到他们的相关信息,例如:QQ用户基本信息、淘宝店铺、商品消息等等。然后在根据这些消息,在你的应用里完成交互。
  其实,ajax 也是调用 API 的一种体现形式,你觉得呢? 呵呵~~
积分:5816
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。

我要回帖

更多关于 php 阿里云发送短信 的文章

 

随机推荐