![](/img/trans.png)
[英]Best approach for PHP Web Service with multiple clients & preventing cache stampede
[英]Best approach for handling multiple PHP scripts as a backend REST service?
我有一個典型的網站設置,其中使用AJAX與PHP腳本進行通信,然后這些PHP腳本將數據讀取和寫入MySQL數據庫。 在我以前的項目中,我需要制作的PHP腳本數量很少,因為我需要讀取或寫入的數據沒有太多變化。 這個站點有些不同,我為每個AJAX調用創建不同的PHP腳本的常規方法導致了大量的PHP腳本。
我決定采用不同的方法,並在同一PHP腳本中對相似的查詢進行分組。 例如,如果我有以下電話:
getGroupById
getAllGroups
createNewGroup
在我以前的方法中,我將有三個單獨的php文件,但是現在我有一個可以完成所有這三個文件。
事實證明,隨着項目的發展,我采取的第二種方法無法維持。 例如,如果我想在同一個腳本中進行多個GET調用,則現在必須從AJAX調用中向腳本傳遞另一個參數,以便PHP腳本知道要執行的查詢。
這兩種方法中哪一種更好? 是否有任何眾所周知的實踐或設計模式來處理?
如果您確實想成為RESTful,請嘗試使PHP文件結構獨立於您希望AJAX請求的方式。
一種常見的設計模式是為您擁有的每個數據實體創建一個表示,然后在該表示上定義CRUD操作。 然后,HTTP方法標頭用作應執行的操作的標識符。
例如,假設您具有以下“部分”數據:
如果可能,請在.htaccess中使用類似Apache的mod_rewrite之類的東西來創建一些看起來不錯的URL,如下所示:
接下來,使用AJAX將參數傳遞給GET , PUT , DELETE或POST請求中的其中一個URL。 通常,AJAX庫允許您定義除GET或POST之外的其他操作。 例如,要刪除jQuery中ID為415的名為Bob的用戶,您可以編寫以下內容:
$.ajax ({
url: 'http://example.com/api/user'
method: 'DELETE',
data: { id: 415 }
success: {
// it works!
}
});
下一步是使用PHP捕獲數據。 我建議為每個“數據”段創建一個單獨的文件,但是當腳本越來越大時,可以更改此文件。 只需調整HTTP服務器的重寫規則即可 。
api / user.php
// determine what operation was requested
switch ($_SERVER['REQUEST_METHOD'])
{
case 'POST':
$data = $_POST;
// ...
case 'GET':
$data = $_GET;
// e.g. if an ID was provided, fetch one user, else fetch all of the users
if (isset ($data ['id']))
fetch_user ($id);
else
fetch_users ();
break;
case 'PUT':
$data = parse_str (file_get_contents('php://input'), $put_vars); // see below
// ...
case 'DELETE':
$data = parse_str (file_get_contents('php://input'), $put_vars); // see below
// ...
default:
// 405 = Method Not Allowed
http_response_code(405); // for PHP >= 5.4.0
exit;
}
// a whole list of functions to add, retrieve, delete and manipulate users
function fetch_user ($id)
{
$query = "SELECT * FROM users WHERE id = ...";
// ...
}
function fetch_users ()
{
// ...
}
資料來源:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.