ملفات الكوكيز في لغة 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 — حيث تجعل المفاتيح المسماة من الصعب جدًّا الخلط في ترتيب المعلمات.


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 لمنع جافا سكريبت من قراءتها.

📖 ملخص

📝 تمارين

  1. تنفيذ ميزة «تذكرني»: نموذج تسجيل دخول يحتوي على خانة اختيار، بحيث يتم ملء حقل اسم المستخدم تلقائيًا عند الزيارة التالية إذا تم تحديد هذه الخانة.
  2. إنشاء أداة لتبديل السمة: تمكين المستخدمين من التبديل بين الوضع الفاتح والوضع الداكن في الصفحة، وحفظ الاختيار في ملف تعريف ارتباط، وتطبيقه في الزيارات اللاحقة.
  3. إنشاء ميزة «المقالات التي تمت مشاهدتها مؤخرًا»: استخدم ملف تعريف ارتباط لتخزين معرّفات آخر 5 مقالات شاهدها المستخدم (يتم تخزينها كسلسلة مفصولة بفواصل).
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%