PHP: thinkPHP踩坑記錄(實現API接口以及處理莫名其妙的500問題)


因為各種原因開始學習PHP,並且要在兩周內能夠對PHP項目進行二次開發,還好PHP夠簡單,至少入門很簡單,很快就接觸thinkPHP框架.

在了解了路由匹配視圖的規則之后,開始着手嘗試編寫API接口,期間由於沒有好好查看官方的命名規范文檔,導致出了些不必要的錯誤.

命名規范文檔: https://www.kancloud.cn/manual/thinkphp5/118007

目前發現的能夠輸出json數據的關鍵字有兩個:

return   返回數據

exit       返回並退出(結束進程)

開發前后端分離開發中,GET請求比較好處理,通過 $_GET變量可以直接拿到查詢字符串參數, 但是AJAX 的 請求體發送 json 數據不能通過 $_POST變量拿到, 據說該變量只能接受網頁方式傳遞的表單數據.

想拿到ajax 傳遞的 json數據可以通過  

file_get_contents('php://input')

方式拿到,但是拿到的是字符串形式的json,需要解析:

json_decode(file_get_contents('php://input'))

PHP提供一個Json類可以直接響應json格式的數據, 也可以通過 exit(json)的方式來輸出json數據,只是exit執行之后會結束整個進程,這里需要注意.

另外由於exit函數接受的是字符串形式的參數,所以需要手動修改響應頭:

1 header('Content-Type:application/json; charset=utf-8');
2 exit(json_encode(json);

所以我就可以寫一個基類了:

 1 <?php
 2 namespace app\commonBase\controller;
 3 
 4 class BaseController
 5 {
 6     protected function responseJson($code=200, $msg="success", $data=[], $status=200) {
 7         $resp = array('code'=>$code, 'msg'=>$msg, 'data'=>$data);
 8 
 9         // 返回JSON數據格式到客戶端 包含狀態信息
10         header('Content-Type:application/json; charset=utf-8');
11         return json($resp, $status);
12     }
13 
14     // 解析 ajax 請求體數據
15     protected function ajaxJsonData() {
16         return json_decode(file_get_contents('php://input'));
17     }
18     
19     // 獲取請求體數據
20     protected function bodyParams($key='') {
21         $body = $this->ajaxJsonData();
22         if (isset($body[$key])) {
23             return $body[$key];
24         } else {
25             return null;
26         }
27     }
28 
29     // 解析查詢字符串數據
30     protected function queryParams($key='') {
31         if (isset($_GET[$key])) {
32             return $_GET[$key];
33         } else {
34             return null;
35         }
36     }
37 }

 

可能是受Python的框架風格影響較深,總喜歡將后台業務代碼再進行細化, 具體的數據庫操作,請求數據解析,權限管理等邏輯進行分離, 方便管理和維護.

 

除了上面的問題之外,還有一個很詭異的問題,就是我的接口運行正常,也能正常響應,但是前端瀏覽器顯示狀態碼為 500;

找了下網上的資料,發現時日志寫入權限的問題,查看了下Apache運行日志:

問題出在這個位置:

第46行,如果路徑不是目錄,則創建目錄,目錄名什么的可以到源代碼里面去找:

把這個文件夾的寫入權限加上就可以了.

public/runtime文件夾


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM