Menu

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
מודלהרצה חדשה לכל בקשה, בלי שום דבר משותףתהליך ממושך אחד עם לולאת אירועים
המתנה ל-I/Oחוסמת את הבקשה הזו (בקשות אחרות רצות ב-workers אחרים)לא חוסמת, async/await
טובה באתרים שמרונדרים בשרת, מערכות ניהול תוכן, אפליקציות CRUD קלאסיותאפליקציות בזמן אמת, websockets, הרבה חיבורים רדומים
אחסוןכל אחסון משותף, PHP-FPMמנהל תהליכים ל-Node או פלטפורמה כמו Vercel
פריימוורקים גדוליםLaravel, Symfony, WordPressExpress, NestJS, Next.js
שפה אחת לפרונט ולבקלאכן

המודל של PHP סלחני: באג או דליפת זיכרון משפיעים רק על בקשה אחת, וכל בקשה מתחילה נקייה. המודל של Node יכול לשמור מצב וחיבורים פתוחים, וזה מתאים לצ'אט ולדשבורדים חיים, אבל קריסה או לולאה חוסמת משפיעות על כל המשתמשים של אותו תהליך.

מה ללמוד

תצטרכו JavaScript לכל דף אינטרנט אינטראקטיבי, כי זו השפה היחידה שדפדפנים מריצים. השאלה היא מה רץ על השרת:

  • למדו PHP בהמשך אם אתם רוצים לעבוד עם WordPress, עם Laravel או עם אתרי PHP הרבים שכבר קיימים, או אם אתם רוצים את הדרך הפשוטה ביותר להעלות אתר דינמי לאחסון זול. התחילו עם מה זה PHP.
  • הישארו עם JavaScript (Node.js) אם אתם רוצים שפה אחת לכל המערכת או בונים יכולות בזמן אמת.

מסלול נפוץ הוא HTML ו-CSS, אחר כך JavaScript בדפדפן, ואז שפת שרת אחת. איזו שפת שרת שלא תבחרו, טפסים, סשנים, מסדי נתונים ו-API של 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

להתחיל