1. 有人用php做過手機端的網站開發嗎
利用PHP框架做手機APP開發需要考慮兩種可能:
第一:如果需要即時通訊,也就是需要手機客戶端與服務端保持TCP長連接,服務端需要向客戶端推送數據的時候可以隨時通過這個長連接發送數據給客戶端,這樣便能做到客戶端與服務端及時通訊甚至客戶端與客戶端及時通訊。做到這需要PHP能維持很多客戶端連接,並且需要多進程支持,支持自己的通訊協議。這樣的應用傳統的nginx+php-fpm + 傳統的php框架是做不到的。如果是長連接即時通訊類的伺服器框架推薦一看下workerman,它是就是一個php的socket伺服器框架,非常適合做手機後台伺服器框架。
第二:如果不需要即時通訊的話,可以考慮直接走http協議,用nginx+php-fpm搭建一個webserver就好了,php框架可以採用thinkphp、yii等等,客戶端需要與伺服器通訊的時候向服務端get/post一個請求就好。
如果是比較簡單的手機APP,例如新聞客戶端這樣的不會涉及到長連接的服務,那麼可以考慮直接使用http協議。因為該協議幾乎被所有可以上網的設備支持,手機客戶端那邊也有大量相關的庫可以調用,省掉不少麻煩,其實確定了這三個:協議(HTTP)、數據表示方法(JSON)、請求數據的方法(REST)之後,基本上就可以開發一個簡單地服務端介面了(業務邏輯得自己琢磨),再加上手機客戶端那邊配套的設置搭起來,那麼就可以了。
2. 用thinkphp寫一個app登錄的介面 麻煩哪位大神給個事例
1、可以使用 REST模式 來開發 App 介面,首先建立一個公共控制器,再建其他控制器繼承它即可。
2、確定好返回的數據內容格式及信息碼;
<?php
// App介面公共控制器 AppController
namespace Api\Controller;
use Think\Controller\RestController;
class AppController extends RestController {
// 自動載入的東西
function _initialize() { }
// 驗證 客戶端 token
protected function checkAppToken($apptoken){
// 引入 function.php 中定義的檢測 apptoken 的函數
if(checkingAppToken($apptoken)){
return true;
}else{
$data['code'] = '404';
$data['msg'] = 'apptoken無效';
$data['data'] = null;
$this -> response($data, 'json');
exit();
}
}
// 驗證 用戶 token
protected function checkUserToken($usertoken){
}
// 各種驗證 ……
}
?>
復制代碼
其他介面控制器繼承 AppController
<?php
// 內容控制器 ContentsController
namespace Api\Controller;
class ContentsController extends AppController {
// 自動載入驗證
function _initialize() {
parent::_initialize();
// 驗證 客戶端 token
$apptoken = I('post.apptoken');
parent::checkAppToken($apptoken);
// 驗證 用戶 token
$usertoken = I('post.usertoken');
parent::checkUserToken($usertoken);
// 各種需要驗證的驗證 ……
}
// 各種業務方法
public function index(){
// 返回數據
$this -> response($data, 'json');
exit();
}
}
?>
3. 如何利用Thinkphp框架開發移動端介面詳解
方案一:給原生APP提供api介面
使用TP框架時 放在common文件夾下文件名就叫function.php
<?php
/**
*Createdbyzhangkx
*Email:[email protected]
*Date:2015/8/1
*Time:23:15
*/
/******api開發輔助函數*******/
/**
*@paramnull$msg返回正確的提示信息
*@paramflagsuccessCURD操作成功
*@paramarray$data具體返回信息
*Functiondescript:返回帶參數,標志信息,提示信息的json數組
*
*/
functionreturnApiSuccess($msg=null,$data=array()){
$result=array(
'flag'=>'Success',
'msg'=>$msg,
'data'=>$data
);
printjson_encode($result);
}
/**
*@paramnull$msg返回具體錯誤的提示信息
*@paramflagsuccessCURD操作失敗
*Functiondescript:返回標志信息『Error',和提示信息的json數組
*/
functionreturnApiError($msg=null){
$result=array(
'flag'=>'Error',
'msg'=>$msg,
);
printjson_encode($result);
}
/**
*@paramnull$msg返回具體錯誤的提示信息
*@paramflagsuccessCURD操作失敗
*Functiondescript:返回標志信息『Error',和提示信息,當前系統繁忙,請稍後重試;
*/
functionreturnApiErrorExample(){
$result=array(
'flag'=>'Error',
'msg'=>'當前系統繁忙,請稍後重試!',
);
printjson_encode($result);
}
/**
*@paramnull$data
*@returnarray|mixed|null
*Functiondescript:過濾post提交的參數;
*
*/
functioncheckDataPost($data=null){
if(!empty($data)){
$data=explode(',',$data);
foreach($dataas$k=>$v){
if((!isset($_POST[$k]))||(empty($_POST[$k]))){
if($_POST[$k]!==0&&$_POST[$k]!=='0'){
returnApiError($k.'值為空!');
}
}
}
unset($data);
$data=I('post.');
unset($data['_URL_'],$data['token']);
return$data;
}
}
/**
*@paramnull$data
*@returnarray|mixed|null
*Functiondescript:過濾get提交的參數;
*
*/
functioncheckDataGet($data=null){
if(!empty($data)){
$data=explode(',',$data);
foreach($dataas$k=>$v){
if((!isset($_GET[$k]))||(empty($_GET[$k]))){
if($_GET[$k]!==0&&$_GET[$k]!=='0'){
returnApiError($k.'值為空!');
}
}
}
unset($data);
$data=I('get.');
unset($data['_URL_'],$data['token']);
return$data;
}
}
查詢單個果品詳細信息
/**
*發布模塊
*
*獲取信息單個果品詳細信息
*
*/
(){
//檢查是否通過post方法得到數據
checkdataPost('id');
$where['id']=$_POST['id'];
$field[]='id,fruit_name,high_price,low_price,address,size,weight,fruit_pic,remark';
$releaseInfo=$this->release_obj->findRelease($where,$field);
$releaseInfo['remark']=mb_substr($releaseInfo['remark'],0,49,'utf-8').'...';
//多張圖地址按逗號截取字元串,截取後如果存在空數組則需要過濾掉
$releaseInfo['fruit_pic']=array_filter(explode(',',$releaseInfo['fruit_pic']));
$fruit_pic=$releaseInfo['fruit_pic'];unset($releaseInfo['fruit_pic']);
//為圖片添加存儲路徑
foreach($fruit_picas$k=>$v){
$releaseInfo['fruit_pic'][]='http://'.$_SERVER['HTTP_HOST'].'/Uploads/Release/'.$v;
}
if($releaseInfo){
returnApiSuccess('',$releaseInfo);
}else{
returnApiError('什麼也沒查到(+_+)!');
}
}
findRelease()方法的model
/**
*查詢一條數據
*/
publicfunctionfindRelease($where,$field){
if($where['status']==''||empty($where['status'])){
$where['status']=array('neq','9');
}
$result=$this->where($where)->field($field)->find();
return$result;
}
app端接收到的數據(解碼json之後)
{
"flag":"success",
"message":"",
"responseList":{
"id":"2",
"fruit_name":"蘋果",
"high_price":"8.0",
"low_price":"5.0",
"address":"天津小白樓水果市場",
"size":"2.0",
"weight":"2.0",
"remark":"急需...",
"fruit_pic":[
"http://fruit.txunda.com/Uploads/Release/201508/55599e7514815.png",
"http://fruit.txunda.com/Uploads/Release/201508/554f2dc45b526.jpg"
]
}
}
app端接收到的數據(原生json串)
代碼如下:
{"flag":"success","message":"","responseList":{"id":"2","fruit_name":"u82f9u679c","high_price":"8.0","low_price":"5.0","address":"","size":"2.0","weight":"2.0","remark":"u6025u9700...","fruit_pic":["http://fruit.txunda.com/Uploads/Release/201508/55599e7514815.png","http://fruit.txunda.com/Uploads/Release/201508/554f2dc45b526.jpg"]}}
方案二:另外我們還可以通過ThinkPHP實現移動端訪問自動切換主題模板,這樣也可以做到移動端訪問
ThinkPHP的模板主題機制,如果只是在PC,只要需修改 DEFAULT_THEME (新版模板主題默認是空,表示不啟用模板主題功能)配置項就可以方便的實現多模板主題切換。
但對於移動端與PC端,也許你會設計完全不同的主題風格,且針對不同的來路提供不同的渲染方式,其中一種比較流行的方法是「響應式設計」,但就本人經歷而言,要實現完全的「響應式設計」並不是那麼容易,且解決兼容問題也是個難題,假設是大型站點,比如:淘寶、網路、拍拍這些,響應式設計肯定是滿足不了需求的,而是需要針對手機訪問用戶提供單獨的手機網站。
ThinkPHP 完全能夠實現,而且非常的簡單。與TPM的智能模版切換引擎相同,只要對來路進行判斷處理就行了。
一、將 ismobile() 加入到{項目/Common/common.php}
functionismobile(){
//如果有HTTP_X_WAP_PROFILE則一定是移動設備
if(isset($_SERVER['HTTP_X_WAP_PROFILE']))
returntrue;
//此條摘自TPM智能切換模板引擎,適合TPM開發
if(isset($_SERVER['HTTP_CLIENT'])&&'PhoneClient'==$_SERVER['HTTP_CLIENT'])
returntrue;
//如果via信息含有wap則一定是移動設備,部分服務商會屏蔽該信息
if(isset($_SERVER['HTTP_VIA']))
//找不到為flase,否則為true
returnstristr($_SERVER['HTTP_VIA'],'wap')?true:false;
//判斷手機發送的客戶端標志,兼容性有待提高
if(isset($_SERVER['HTTP_USER_AGENT'])){
$clientkeywords=array(
'nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap','mobile'
);
//從HTTP_USER_AGENT中查找手機瀏覽器的關鍵字
if(preg_match("/(".implode('|',$clientkeywords).")/i",strtolower($_SERVER['HTTP_USER_AGENT']))){
returntrue;
}
}
//協議法,因為有可能不準確,放到最後判斷
if(isset($_SERVER['HTTP_ACCEPT'])){
//如果只支持wml並且不支持html那一定是移動設備
//如果支持wml和html但是wml在html之前則是移動設備
if((strpos($_SERVER['HTTP_ACCEPT'],'vnd.wap.wml')!==false)&&(strpos($_SERVER['HTTP_ACCEPT'],'text/html')===false||(strpos($_SERVER['HTTP_ACCEPT'],'vnd.wap.wml')<strpos($_SERVER['HTTP_ACCEPT'],'text/html')))){
returntrue;
}
}
returnfalse;
}
二、在{項目/Lib/}創建一個 CommonAction.php,假設你的項目已公共控制器,則無需創建,直接加在裡面就行了。
{
Publicfunction_initialize(){
//移動設備瀏覽,則切換模板
if(ismobile()){
//設置默認默認主題為Mobile
C('DEFAULT_THEME','Mobile');
}
//............你的更多代碼.......
}
}
4. PHP---APP介面02
JSON&XML
XML: 是一種標記語言,設計的宗旨是傳輸數據
JSON: 輕量級的數據交換格式
APP介面主要是用JSON輸出格式
APP介面輸出格式三要素:
1. code::錯誤碼
2. msg:錯誤碼對應的描述
3. data:介面返回的數據
誰有許可權調用APP介面,客戶端需要帶著憑證來調用APP介面
JWT的原理:
服務端認證之後,生成一個JSON對象,返回給用戶。後續客戶端所有請求都會帶上這個JSON對象。服務端依靠這個JSON對象來認定用戶身份。
組成: Header, Payload, Signature
1. Header
說一下我是什麼
{
"alg": "HS256",
"typ": "JWT"
}
header需要經過Base64Url編碼後作為IWT的第一部分。
2. Payload
payload包含了claim, 三種類型reserved, public, private
reserved這些claim是JWT預先定義的,不強制使用,常用的有:
1). iss: 簽發者
2). exp: 過期的時間戳
3). sub: 面向的用戶
4). aud: 接收方
5). iat: 簽發時間
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
payload需要經過Base64Url編碼後作為JWT的第二部分。
3. Signature
創建簽名使用編碼後的header和payload以及一個密匙,使用header中指定的簽名演算法進行簽名
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
簽名是在服務端進行的,客戶端並不知道,所以是安全的。
5. php寫app介面怎麼做分頁,實現下拉顯示更多
app介面分頁如何做:
兩種普遍的:1、下拉刷新,2、頁數點擊
app發送參數:page(當前條數),pageNum(每頁顯示條數)
php獲取參數:通過sql語句查詢:select * from yourTableName limit page-1,pagenum
那麼返回的結果就是你所需要的,這是符合下拉刷新的,翻頁其實也是一樣的。
具體樣式和發送參數app控制,php只是得到參數返回不同的數據
請採納
6. 如何使用PHP的CodeIgniter框架來編寫API介面
1.將解壓的框架包放到的你的php環境的www/api目錄下:這里建立api目錄作為測試項目目錄。並運行localhost/api/index.php,就可以看到環境界面了
9.在瀏覽器中運行介面,根據不同的參數返回不同的數據。
獲取的是json數據
localhost/api/index/php?username=張三&format=json
獲取的是xml數據
localhost/api/index/php?username=張三&format=xml