ملفات الكوكيز في لغة PHP
بروتوكول HTTP لا يحتفظ بالحالة — أي أن الخادم لا يتذكر هويتك بين الطلبات. وتحل ملفات تعريف الارتباط هذه المشكلة: حيث يرسل الخادم إلى متصفحك «ملاحظة صغيرة»، وعندما يعود متصفحك بها في المرة التالية، يقول الخادم: «أوه، إنه أنت!»
1. ما هي ملفات تعريف الارتباط؟
ملف تعريف الارتباط هو جزء صغير من البيانات (≤ 4 كيلوبايت) يطلب الخادم من المتصفح تخزينه على جهاز الكمبيوتر الخاص بالمستخدم. ويقوم المتصفح بإرساله تلقائيًا مع كل طلب لاحق.
TEXT
First visit:
Browser → Server: Hello!
Server → Browser: Here's a cookie: user=John
Next visit:
Browser → Server: Hello, here's my cookie: user=John
Server: Ah, John — your cart is still here!
PHP
<?php
// Create a cookie
setcookie("username", "John", time() + 3600, "/");
// Read a cookie
echo $_COOKIE['username'] ?? 'Guest'; // John (persists after refresh)
?>
2. معلمات دالة setcookie()
PHP
setcookie(
string $name, // Cookie name
string $value = "", // Cookie value
int $expires = 0, // Expiry (Unix timestamp; 0 = expires when browser closes)
string $path = "", // Path scope ("/" = entire site)
string $domain = "", // Domain scope
bool $secure = false, // HTTPS only
bool $httponly = false // Inaccessible to JavaScript
);
PHP
<?php
// Simplest cookie (deleted when the browser closes)
setcookie("visit_count", "1");
// Cookie that expires in 1 hour
setcookie("username", "John", time() + 3600, "/");
// Cookie that expires in 7 days
setcookie("remember_token", "abc123", time() + 86400 * 7, "/");
// Secure cookie (HTTPS only, JS can't read it)
setcookie("session_id", "xyz789", [
'expires' => time() + 3600,
'path' => '/',
'secure' => true, // HTTPS only
'httponly' => true, // Blocks XSS-based theft
'samesite' => 'Lax' // Mitigates CSRF
]);
?>
💡 نصيحة: يُوصى في PHP 7.3 وما فوق باستخدام التوقيع بنمط المصفوفة
setcookie — حيث تجعل المفاتيح المسماة من الصعب جدًّا الخلط في ترتيب المعلمات.
3. قراءة ملفات تعريف الارتباط: $_COOKIE
PHP
<?php
$username = $_COOKIE['username'] ?? 'Guest';
echo "Welcome, {$username}!";
// $_COOKIE is a superglobal associative array
print_r($_COOKIE);
// Array ( [username] => John [visit_count] => 5 )
?>
▶ مثال: عداد الزيارات
PHP
<?php
// First visit
if (!isset($_COOKIE['visit_count'])) {
setcookie('visit_count', 1, time() + 86400 * 30, "/");
echo "Welcome — this is your first visit!";
} else {
$count = (int)$_COOKIE['visit_count'] + 1;
setcookie('visit_count', $count, time() + 86400 * 30, "/");
echo "This is visit #{$count}!";
}
?>
4. حذف ملفات تعريف الارتباط
لا توجد وظيفة مخصصة لـ«حذف ملف تعريف الارتباط» — يمكنك حذف ملف تعريف الارتباط عن طريق تعيين تاريخ انتهاء صلاحيته في الماضي:
PHP
<?php
// Delete a cookie
setcookie("username", "", time() - 3600, "/");
// Expiry in the past → browser discards it
// unset only removes $_COOKIE from the current request — the browser still has the cookie
unset($_COOKIE['username']);
// This only affects the current script; after a refresh, the cookie is back
?>
🔥 خطأ شائع:
setcookie("name", "", time() - 3600) هي التي تقوم فعليًّا بإزالة ملف تعريف الارتباط من المتصفح. أما unset($_COOKIE['name']) فهي تكتفي بمسح المتغير الخاص بالطلب الحالي فقط.
5. سمات أمان ملفات تعريف الارتباط
| السمة | الغرض | التوصية |
|---|---|---|
httponly |
لا يمكن لـ JavaScript قراءة ملفات تعريف الارتباط (يمنع سرقة XSS) | ✅ تمكين دائمًا |
secure |
يتم الإرسال عبر HTTPS فقط | ✅ تم التفعيل في بيئة الإنتاج |
samesite |
تُرسل فقط في طلبات الموقع نفسه (للحد من هجمات CSRF) | Lax أو Strict |
path |
يحدد مسار ملف تعريف الارتباط بمسار معين | "/" على مستوى الموقع بأكمله |
PHP
<?php
// Secure cookie template
setcookie("user_token", $token, [
'expires' => time() + 86400 * 30,
'path' => '/',
'secure' => isset($_SERVER['HTTPS']),
'httponly' => true,
'samesite' => 'Lax'
]);
?>
6. أمثلة واقعية على ملفات تعريف الارتباط
▶ مثال: تذكرني
PHP
<?php
// remember.php
$savedName = $_COOKIE['saved_username'] ?? '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = trim($_POST['username'] ?? '');
$remember = isset($_POST['remember']);
if ($remember) {
// "Remember me" — store for 30 days
setcookie('saved_username', $username, time() + 86400 * 30, '/');
} else {
// Don't remember — delete the cookie
setcookie('saved_username', '', time() - 3600, '/');
}
echo "<h3>Welcome back, {$username}!</h3>";
}
?>
<form method="POST">
<input type="text" name="username"
value="<?= htmlspecialchars($savedName) ?>"
placeholder="Enter your username">
<label>
<input type="checkbox" name="remember"> Remember me
</label>
<button type="submit">Log In</button>
</form>
▶ مثال: أداة تبديل السمات
PHP
<?php
// theme.php
$theme = $_COOKIE['theme'] ?? 'light';
if (isset($_GET['theme'])) {
$theme = $_GET['theme'] === 'dark' ? 'dark' : 'light';
setcookie('theme', $theme, time() + 86400 * 365, '/');
}
?>
<!DOCTYPE html>
<html>
<head>
<style>
body.dark { background: #222; color: #eee; }
body.light { background: #fff; color: #333; }
</style>
</head>
<body class="<?= $theme ?>">
<h2>Current theme: <?= $theme === 'dark' ? 'Dark' : 'Light' ?></h2>
<a href="?theme=dark">Dark Mode</a> |
<a href="?theme=light">Light Mode</a>
</body>
</html>
7. قيود ملفات تعريف الارتباط
| الحد | القيمة |
|---|---|
| حجم كل ملف تعريف ارتباط | ≤ 4096 بايت (4 كيلوبايت) |
| ملفات تعريف الارتباط لكل نطاق | ~20–50 (يختلف حسب المتصفح) |
| إجمالي حجم بيانات ملفات تعريف الارتباط | ~8 كيلوبايت لجميع ملفات تعريف الارتباط |
| الأمان | مخزّن بنص عادي؛ يمكن للمستخدمين الاطلاع عليه وتعديله |
| الإرسال | يتم إرساله تلقائيًا مع كل طلب HTTP |
💡 نصيحة: تُعد ملفات الكوكيز مثالية للبيانات الصغيرة غير الحساسة (مثل تذكر اسم المستخدم أو تفضيلات السمة). أما بالنسبة للبيانات الأكبر حجمًا أو الحساسة، فاستخدم «الجلسات» (الدرس التالي). وللاحتفاظ بالبيانات على المدى الطويل، استخدم قاعدة البيانات.
❓ أسئلة شائعة
س ما الفرق بين ملف تعريف الارتباط (cookie) والجلسة (session)؟
ج تُخزَّن ملفات تعريف الارتباط في المتصفح، بينما تُخزَّن الجلسات على الخادم. ملفات تعريف الارتباط محدودة الحجم ويمكن للمستخدم تعديلها؛ أما الجلسات فهي أكثر أمانًا لكنها تستهلك موارد الخادم. استخدم الجلسات لحالة تسجيل الدخول؛ واستخدم ملفات تعريف الارتباط لخيار «تذكرني» والتفضيلات.
س هل يمكن للمستخدمين التلاعب بملفات تعريف الارتباط؟
ج نعم! تُخزَّن ملفات تعريف الارتباط على جهاز المستخدم، لذا يمكن للمستخدمين تعديلها بحرية. لا تقم أبدًا بتخزين البيانات الحساسة مثل كلمات المرور في ملف تعريف الارتباط دون تشفير. على الأقل، استخدم
httponly لمنع جافا سكريبت من قراءتها.📖 ملخص
- ملفات تعريف الارتباط هي وحدات تخزين من نوع «مفتاح-قيمة» على جانب المتصفح، تُرسل تلقائيًا مع كل طلب
setcookie(name, value, expire, path)ينشئ ملف تعريف ارتباط- اضبط تاريخ انتهاء الصلاحية على طابع زمني مضى عليه وقت لـحذف ملف تعريف الارتباط
$_COOKIEيحتفظ بملفات تعريف الارتباط المرسلة مع الطلب الحالي (تتطلب ملفات تعريف الارتباط التي تم تعيينها حديثًا تحديثًا)httponly(يحظر JS)، وsecure(HTTPS فقط)، وsamesite(حماية CSRF) هي علامات أمان أساسية- يبلغ الحد الأقصى لحجم ملفات الكوكيز 4 كيلوبايت، ويمكن للمستخدم تعديلها، وهي الأنسب للبيانات الصغيرة غير الحساسة
📝 تمارين
- تنفيذ ميزة «تذكرني»: نموذج تسجيل دخول يحتوي على خانة اختيار، بحيث يتم ملء حقل اسم المستخدم تلقائيًا عند الزيارة التالية إذا تم تحديد هذه الخانة.
- إنشاء أداة لتبديل السمة: تمكين المستخدمين من التبديل بين الوضع الفاتح والوضع الداكن في الصفحة، وحفظ الاختيار في ملف تعريف ارتباط، وتطبيقه في الزيارات اللاحقة.
- إنشاء ميزة «المقالات التي تمت مشاهدتها مؤخرًا»: استخدم ملف تعريف ارتباط لتخزين معرّفات آخر 5 مقالات شاهدها المستخدم (يتم تخزينها كسلسلة مفصولة بفواصل).



