ساخت API در PHP
ایجاد یک API با PHP یکی از مهارتهای اساسی برای توسعهدهندگان وب است. این مقاله گامبهگام مفاهیم کلیدی، الگوهای کاربردی، نمونه کد واقعی و نکات امنیتی را پوشش میدهد تا بتوانید یک API ساده، امن و قابل توسعه بسازید.
اصول اولیه و تصمیمگیریها
- نوع API: RESTful رایجترین انتخاب است؛ ساده، مبتنی بر منابع و استفاده از متدهای HTTP (GET, POST, PUT, DELETE).
- فرمت داده: معمولاً JSON برای تعامل بین کلاینت و سرور استفاده میشود.
- کتابخانهها: میتوانید از فریمورکهایی مثل Laravel یا Slim استفاده کنید یا با PHP خالص (vanilla) و composer کار کنید.
- دیتابیس: استفاده از PDO به دلیل امنیت (prepared statements) و قابلیت انتقال بین دیتابیسها توصیه میشود.
معماری پیشنهادی
یک ساختار ساده شامل فایلهای زیر مفید است:
- index.php — نقطه ورود و روتینگ
- db.php — اتصال به دیتابیس با PDO
- controllers/ — منطق منابع (مثلاً UserController.php)
- middlewares/ — احراز هویت، لاگ، کنترل CORS
نمونه: یک API ساده برای مدیریت کاربران (CRUD)
// index.php (simplified)
'Not found']); exit;
}
$id = $uri[2] ?? null;
switch ($method) {
case 'GET':
if ($id) {
// get single user
$stmt = $pdo->prepare("SELECT id,name,email FROM users WHERE id = ?");
$stmt->execute([$id]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
echo json_encode($user ?: []);
} else {
// get all users
$stmt = $pdo->query("SELECT id,name,email FROM users");
echo json_encode($stmt->fetchAll(PDO::FETCH_ASSOC));
}
break;
case 'POST':
$data = json_decode(file_get_contents('php://input'), true);
$stmt = $pdo->prepare("INSERT INTO users (name,email) VALUES (?,?)");
$stmt->execute([$data['name'],$data['email']]);
echo json_encode(['id'=>$pdo->lastInsertId()]);
break;
case 'PUT':
$data = json_decode(file_get_contents('php://input'), true);
$stmt = $pdo->prepare("UPDATE users SET name=?, email=? WHERE id=?");
$stmt->execute([$data['name'],$data['email'],$id]);
echo json_encode(['updated'=> $stmt->rowCount()]);
break;
case 'DELETE':
$stmt = $pdo->prepare("DELETE FROM users WHERE id=?");
$stmt->execute([$id]);
echo json_encode(['deleted'=>$stmt->rowCount()]);
break;
default:
http_response_code(405); echo json_encode(['error'=>'Method not allowed']);
}
?>
توضیح: این کد نقطه ورودی سادهای است که براساس مسیر و متد HTTP عملیات CRUD روی جدول users انجام میدهد. ورودیها از بدنه درخواست بهصورت JSON خوانده میشوند. استفاده از prepare و اجرای پارامترها از حملات SQL injection جلوگیری میکند.
// db.php
PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
} catch (PDOException $e) {
http_response_code(500);
echo json_encode(['error'=>'Database connection failed']);
exit;
}
?>
توضیح: این فایل اتصال امن به دیتابیس را برقرار میکند و خطاها را بهصورت استثناء مدیریت میکند. charset=utf8mb4 برای پشتیبانی از یونیکد کامل ضروری است.
بهبودها و نکات امنیتی
- احراز هویت: استفاده از توکنهای JWT یا OAuth برای محدود کردن دسترسی.
- اعتبارسنجی ورودیها: هم در سمت کلاینت و هم سرور. هر ورودی را بررسی و پاکسازی کنید.
- محدودیت نرخ (Rate limiting) و لاگینگ برای جلوگیری از حملات Brute-force.
- فعال کردن HTTPS و تنظیم هدرهای امنیتی مانند Content-Security-Policy و X-Content-Type-Options.
نمونه پیادهسازی JWT (تأیید توکن)
// auth.php (very simplified, using firebase/php-jwt recommended)
'No token']); exit;
}
list($type, $token) = explode(' ', $headers['Authorization']);
try {
$payload = JWT::decode($token, $secretKey, ['HS256']);
// $payload now contains user data like user id
} catch (Exception $e) {
http_response_code(401); echo json_encode(['error'=>'Invalid token']); exit;
}
?>
توضیح: این کد از کتابخانه محبوب firebase/php-jwt استفاده میکند. توکن را از هدر Authorization استخراج و با کلید مخفی و الگوریتم HS256 اعتبارسنجی میکند. در صورت خطا پاسخ 401 بازگردانده میشود.
مثالهای استفاده و موارد کاربرد
- اپلیکیشنهای موبایل که نیاز به یک لایه backend برای ذخیره و واکشی داده دارند.
- وبسرویس برای SPA (Single Page Application) مثل React یا Vue.
- ادغام بین سیستمها: ارائه API برای اتصال سرویسهای داخلی یا سرویسهای شخص ثالث.
عملکرد و بهینهسازی
برای APIهای پر تراکنش به موارد زیر توجه کنید:
- کشینگ (Redis یا Memcached) برای کاهش بار دیتابیس.
- پگینیشن و انتخاب فیلدها (select specific fields) بهجای بازگرداندن همه ستونها.
- فشردهسازی پاسخها با GZIP و استفاده از HTTP/2 در صورت امکان.
- پیادهسازی health checks و مانیتورینگ (Prometheus, Grafana).
نمونه headerها و CORS
// cors.php (include at top of API)
توضیح: برای دسترسی کلاینتهای سمت مرورگر باید هدرهای CORS تنظیم شوند. در بالا فقط منبع مشخصی مجاز شده است؛ در توسعه محلی میتوانید به طور موقت “*” استفاده کنید اما در تولید اینکار خطرناک است.
مقایسه روشها
| روش | مزایا | معایب |
|---|---|---|
| PHP خالص + PDO | سبک، کنترل کامل، مناسب برای پروژههای کوچک | نیازمند پیادهسازی دستی روتینگ و middleware |
| فریمورک (Laravel) | قابلیت بالا، امنیت، اکوسیستم بزرگ | پیچیدهتر و سنگینتر |
نتیجهگیری و توصیههای عملی
برای شروع سریع از ساختار خالص و PDO استفاده کنید. سپس بهمرور با نیازهای پروژه به سمت فریمورکها یا سرویسهای میکروسرویس حرکت کنید. همیشه روی امنیت، بررسی ورودیها و مانیتورینگ تمرکز داشته باشید. تستهای اتوماتیک (واحد و انتها به انتها) را برای APIهای حیاتی پیاده کنید.
اگر نیاز به نمونه پروژه کامل یا راهنمای نصب Composer، تست JWT یا پیادهسازی Rate Limiting دارید، میتوانم نمونههای آماده و گامبهگام بیشتری ارائه دهم.
آیا این مطلب برای شما مفید بود ؟



