Menu
flag Ar iconالعربيةdown icon

PHP أم JavaScript: الخادم والمتصفح وNode.js

تعمل PHP على الخادم وترسل HTML جاهزًا إلى المتصفح. أما JavaScript فتعمل في المتصفح، حيث تغيّر الصفحة بعد تحميلها، وعلى الخادم مع Node.js. تستخدم معظم المواقع اللغتين: PHP لبناء الصفحات وواجهات API، وJavaScript للتفاعل.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

تعمل PHP على الخادم: تبني الصفحة، وترسل HTML الجاهز، ثم تتوقف. أما JavaScript فتعمل في متصفح الزائر، حيث تتفاعل مع النقرات وتغيّر الصفحة بعد تحميلها، ومع Node.js يمكنها العمل على الخادم أيضًا. لذا فاللغتان شريكتان أكثر من كونهما متنافستين: يستخدم الموقع المعتاد PHP (أو Node.js) على الخادم وJavaScript في المتصفح.

هذا الكود بلغة PHP يعمل على الخادم. لا يستقبل المتصفح إلا ما يطبعه، ويعرض تبويب Page تلك النتيجة:

انظر إلى تبويب Output: لم يبقَ فيه أي PHP، بل HTML فقط. والقائمة نفسها مبنية بـ JavaScript في المتصفح تبدو هكذا:

const products = [
  { name: "Keyboard", price: 49 },
  { name: "Mouse", price: 19 },
  { name: "Monitor", price: 189 },
];

const ul = document.querySelector("#cart"); // an empty <ul id="cart"> in the HTML
for (const p of products) {
  const li = document.createElement("li");
  li.textContent = `${p.name}: $${p.price}`;
  ul.append(li);
}

ترسل نسخة PHP صفحة كاملة، تقرؤها محركات البحث والهواتف البطيئة فورًا. أما نسخة JavaScript فتستطيع تحديث القائمة لاحقًا دون إعادة تحميل، مثلًا عندما يحذف الزائر عنصرًا.

أين تعمل كل لغة

PHPJavaScript
تعمل فيخادم الويب (أو الطرفية)المتصفح، وعلى الخادم مع Node.js أو Deno أو Bun
ترىالملفات وقواعد البيانات والبيئة والأسرارالصفحة (DOM) والنقرات وتخزين المتصفح
مدة الحياةتشغيل واحد لكل طلبما دامت الصفحة مفتوحة (المتصفح)، أو عملية واحدة طويلة (Node.js)
العمل المعتادبناء الصفحات ومعالجة النماذج وواجهات API والتعامل مع قاعدة البياناتالتفاعل والتحديثات الحية وتطبيقات الصفحة الواحدة وخوادم Node.js
هل يستطيع الزائر قراءة الكودلانعم، في المتصفح

الصف الأخير مهم للأمان: كل ما في JavaScript المتصفح مرئي للزائر، لذا مكان كلمات المرور ومفاتيح API والتحقق من الأسعار هو الخادم.

الصياغة جنبًا إلى جنب

تتشابه اللغتان لأن كلتيهما تقتبس من C: الأقواس المعقوصة وif وfor وwhile وfunction وreturn. والفروق في التفاصيل:

المهمةPHPJavaScript
متغير$name = "Ada";let name = "Ada";
ثابتconst MAX = 10;const MAX = 10;
ربط النصوص"Hi " . $name"Hi " + name
نص قالب"Hi $name"`Hi ${name}`
قائمة["a", "b"]["a", "b"]
مفتاح/قيمة["id" => 1]{ id: 1 }
الطولcount($list), strlen($s)list.length, s.length
حلقةforeach ($list as $item)for (const item of list)
دالة سهميةfn($x) => $x * 2(x) => x * 2
الطباعةecho "Hi";console.log("Hi");

هذه دالة مع دالة رد نداء (callback) بلغة PHP:

وبلغة JavaScript، حيث map وfilter دوال تابعة للمصفوفة:

const prices = [12.5, 8, 30, 4.25];

const withTax = prices.map((p) => Math.round(p * 1.2 * 100) / 100);
const cheap = withTax.filter((p) => p < 15);

console.log(withTax.join(", "));
console.log("Under 15: " + cheap.join(", "));

العامل +: الفخ الكلاسيكي

في JavaScript يجمع + الأعداد ويربط النصوص معًا، لذا فإن وجود نص في أي مكان يحوّل الجمع إلى ربط. أما PHP فتفصل بينهما: + يجمع دائمًا و. يربط دائمًا.

console.log("10" + 5);  // "105"
console.log("10" - 5);  // 5
console.log("3" * "4"); // 12
console.log(0.1 + 0.2 === 0.3); // false

ولدى اللغتين أيضًا المساواة المرنة == والصارمة ===. والنصيحة واحدة في الاثنتين: استخدم === ما لم تقصد المقارنة بين أنواع مختلفة.

تمرير البيانات من PHP إلى JavaScript

تعمل PHP أولًا، لذا تستطيع كتابة البيانات مباشرة في الصفحة لتستخدمها JavaScript في المتصفح. تحوّل json_encode مصفوفة PHP إلى JavaScript صالحة:

يعرض تبويب Output السكربت المولَّد والبيانات مملوءة فيه. يهرّب الخيار JSON_HEX_TAG المحرفين < و>، فلا تستطيع قيمة تحتوي على </script> إنهاء السكربت مبكرًا. المزيد عن الخيارات في json_encode.

والاتجاه الآخر يمر عبر HTTP: تستدعي JavaScript في المتصفح fetch("/api/cart.php")، فيُنفَّذ سكربت PHP ويجيب بـ JSON:

<?php
// api/cart.php
header('Content-Type: application/json');
echo json_encode(['items' => 3, 'total' => 257]);
const res = await fetch("/api/cart.php");
const cart = await res.json();
console.log(cart.total); // 257

PHP مقابل Node.js على الخادم

عندما تعمل JavaScript على الخادم عبر Node.js، تصبح المقارنة اختيارًا حقيقيًا.

PHPNode.js
النموذجتشغيل جديد لكل طلب دون مشاركة أي شيءعملية واحدة طويلة مع حلقة أحداث
انتظار الإدخال والإخراجيحجب ذلك الطلب (الطلبات الأخرى تعمل في عمّال آخرين)غير حاجب، async/await
تبرع فيالمواقع المولّدة على الخادم وأنظمة إدارة المحتوى وتطبيقات CRUD التقليديةالتطبيقات الآنية وwebsockets والاتصالات الخاملة الكثيرة
الاستضافةأي استضافة مشتركة، PHP-FPMمدير عمليات Node أو منصة مثل Vercel
أطر العمل الكبرىLaravel وSymfony وWordPressExpress وNestJS وNext.js
لغة واحدة للواجهة والخلفيةلانعم

نموذج PHP متسامح: الخطأ البرمجي أو تسرب الذاكرة لا يؤثر إلا في طلب واحد، وكل طلب يبدأ نظيفًا. أما نموذج Node فيستطيع إبقاء الحالة والاتصالات مفتوحة، وهذا يناسب الدردشة ولوحات المتابعة الحية، لكن الانهيار أو الحلقة الحاجبة يؤثران في كل مستخدمي تلك العملية.

أيهما تتعلم

ستحتاج إلى JavaScript في أي صفحة ويب تفاعلية، لأنها اللغة الوحيدة التي تشغّلها المتصفحات. والسؤال هو ما الذي يعمل على الخادم:

  • تعلّم PHP بعد ذلك إذا أردت العمل مع ووردبريس أو Laravel أو مواقع PHP الكثيرة الموجودة، أو إذا أردت أبسط طريقة لوضع موقع ديناميكي على استضافة رخيصة. ابدأ بـ ما هي PHP.
  • ابقَ مع JavaScript (Node.js) إذا أردت لغة واحدة للمنظومة كلها أو كنت تبني ميزات آنية.

المسار الشائع هو HTML وCSS، ثم JavaScript في المتصفح، ثم لغة خادم واحدة. وأيًا كانت لغة الخادم التي تختارها، فالنماذج والجلسات وقواعد البيانات وواجهات JSON تعمل على أفكار HTTP نفسها، لذا تنتقل المعرفة معك.

الأسئلة الشائعة

هل يمكن أن تحل JavaScript محل PHP؟

على الخادم، نعم: تؤدي Node.js (مع Express أو Next.js أو ما يشبههما) الأعمال نفسها التي تؤديها PHP. أما في المتصفح فلا تستطيع PHP أن تحل محل JavaScript إطلاقًا، لأن المتصفحات لا تشغّل إلا JavaScript. لهذا تستخدم مواقع كثيرة PHP أو Node على الخادم وJavaScript في المتصفح.

كيف أمرّر متغير PHP إلى JavaScript؟

اطبعه في الصفحة بصيغة JSON: <script>const user = <?= json_encode($user, JSON_HEX_TAG) ?>;</script>. تُنتج json_encode كود JavaScript صالحًا للنصوص والأعداد والمصفوفات والكائنات، ويمنع JSON_HEX_TAG أي </script> داخل البيانات من إغلاق الوسم.

هل تستطيع JavaScript استدعاء دالة PHP؟

ليس مباشرة، لأن PHP تعمل على الخادم وJavaScript في المتصفح. ترسل JavaScript طلب HTTP عبر fetch('/api.php?id=3')، فيُنفَّذ سكربت PHP ويطبع استجابة (عادةً JSON)، ثم تقرؤها JavaScript.

هل PHP أسرع من Node.js؟

يعتمد ذلك على نوع العمل. تتعامل Node.js جيدًا مع اتصالات بطيئة متزامنة كثيرة (الدردشة وwebsockets) بفضل حلقة الأحداث. وPHP 8 مع OPcache سريعة في صفحات الطلب والاستجابة العادية. وفي معظم المواقع تكون قاعدة البيانات هي عنق الزجاجة، لا اللغة.

رسم توضيحي للغات البرمجة في Coddy

تعلّم البرمجة مع Coddy

ابدأ الآن