דרישות מערכת

גרסת PHP, הרחבות, מסד נתונים, שרת רשת, תיקיות כתיבה ו-cron שחייבים להיות מוכנים לפני שמתקינים אתר WIZZO CMS על שרת.

⏱ 8 דק' קריאה 1363 מילים ערוך דף זה ב-GitHub

העמוד הזה מרכז מה שהשרת צריך לספק לפני שהתקנת אתר חדש מתחילה. כל שורה נגזרת מהקוד של הליבה. הליבה חיה ב-api/core/ בריפו ונפרסת ל-system/core/ באתר, ולכן נתיבי הליבה בטבלאות כתובים יחסית ל-api/core.

PHP#

דרישהערךמקור בקוד
גרסת PHP8.3 ומעלהcomposer.json מגדיר config.platform.php = "8.3". מנגנון העדכון (controllers/check_version.php, php_floor()) מחזיר ברירת מחדל 8.3, ו-admin/wizzo_update.php מסרב להחליף ליבה בשרת שגרסת ה-PHP שלו נמוכה מהרצפה (php_too_old)
SAPIApache (mod_php או LiteSpeed LSAPI) או PHP-FPMהליבה לא תלויה ב-SAPI. ב-CLI היא רצה רק דרך index.php (ראו הסעיף Cron בהמשך)
memory_limitמומלץ 512Mהערך באתר הייחוס. הליבה לא כופה ערך
upload_max_filesize, post_max_sizeלפי הצורך באתרבאתר הייחוס 512M ו-1024M. הליבה לא כופה ערך
max_input_varsמומלץ 10240טפסי ניהול גדולים (רשימות, עורך תוכן) שולחים הרבה שדות
display_errorsOff בפרודקשןהליבה כותבת שגיאות ל-error_log
PHP 8.3 הוא רצפה אמיתית

ליבה שדורשת 8.3 הפילה בעבר עשרות אתרים שרצו על 8.1: הקוד של הליבה והחבילות של Composer נטענים בכל בקשה. בדקו php -v בשרת וגם את גרסת ה-PHP שה-vhost או הפאנל של האחסון באמת מפעילים, לא רק את ה-CLI.

אזור זמן
CONFIG::preinit() מגדיר date_default_timezone_set('Asia/Jerusalem') בכל בקשה. הערך קבוע בקוד ולא מגיע מ-php.ini או מ-CONFIG_USER.

הרחבות PHP#

הטבלה כוללת רק הרחבות שהקוד של הליבה (לא ספריות ה-addons/) קורא להן.

הרחבהחובה?למה היא נדרשת
pdo_mysqlחובהDB::create_connection() פותח new PDO("mysql:host=...") כש-CONFIG_USER::$db_type = "PDO"
mbstringחובהפונקציות mb_* בעשרות קבצים של הליבה
curlחובהMISC::ping_url, STORAGE, וקריאות לשירותי Market
zip (ZipArchive)חובה לעדכון ליבהpreflight() ב-admin/wizzo_update.php מחזיר no_zip_extension בלעדיה
zlibחובהob_gzhandler ב-index.php, וקבצי המטמון נשמרים כ-.chc.gz ו-.html.gz
opensslחובהhttps ליציאות (עדכון, Market) ויצירת ערכים אקראיים ב-libraries/bcrypt.php
jsonחובהבשימוש בכל הליבה (מובנית ב-PHP 8)
ctypeחובהctype_digit ב-collections/cache_engine.php וב-collections/STORAGE.php
dom ו-libxmlחובהnew DOMDocument ב-controllers/minify.php (עיבוד סקריפטים לעמוד) וב-collections/FILES.php
gdחובה להעלאת תמונותimagecreatefromstring, imagejpeg, imagewebp ב-collections/STORAGE.php
fileinfoמומלצתfinfo_open ו-mime_content_type ב-admin/storage.php וב-admin/newpage_media.php
imagickאופציונליתטשטוש תמונה (blurImage ב-STORAGE) ותצוגת PDF (controllers/pdf_viewer.php). איכות JPEG משתמשת בה רק כש-extension_loaded('imagick')
ftpרק עם $storage_remote = "ftp"ftp_connect ב-STORAGE
simplexmlאופציונליתsimplexml_load_string ב-libraries/SeoIndexNow.php

הערות:

  • exec() חייבת להיות פעילה: MISC::ping() מריצה את משימות ה-Cron דרך sh -c "nohup php index.php ...", ו-libraries/CronEditor.php מתקין את ה-crontab.
  • allow_url_fopen חייב להיות פעיל לעדכון ליבה: admin/wizzo_update.php קורא כתובות https עם file_get_contents ו-copy.
  • חבילות Composer (phpoffice/phpspreadsheet ו-guzzlehttp/guzzle בין היתר) מוסיפות הרחבות משלהן. composer install נכשל ומציין הרחבה חסרה. הריצו composer check-platform-reqs ב-system/core כדי לראות את הרשימה המלאה לפני הפריסה.
  • CRYPT_BLOWFISH חייב להיות 1 (ברירת המחדל בכל PHP מודרני): סיסמאות מנהלים נבדקות ב-bcrypt.

מסד נתונים#

נושאערך
מנועMySQL או MariaDB. אין בקוד בדיקת גרסה מינימלית, ולכן אין "רצפה" נאכפת
גרסה מומלצתMySQL 8 או MariaDB 10.4 ומעלה. זו הגרסה ש-DDL של SQL להקמה נכתב עבורה. החיפוש בפאנל המדיה משתמש ב-MATCH ... AGAINST על InnoDB, שדורש MySQL 5.6 או MariaDB 10.0.5 לפחות
קידודutf8mb4. הליבה מריצה set names utf8mb4 בכל חיבור (DB::$encoding)
sql_modeהליבה מריצה SET SESSION sql_mode = '' בכל חיבור, כך שמצב STRICT של השרת לא משפיע על הליבה. סקריפטים חיצוניים שמתחברים לאותו מסד כן יושפעו
קידומת טבלאותCRM בלבד (CONFIG_USER::$db_prefix = "CRM"). הקידומת CRM_ כתובה ישירות בכ-80 מקומות
הרשאות המשתמשSELECT, INSERT, UPDATE, DELETE וגם CREATE ו-ALTER: הליבה יוצרת טבלאות ועמודות חסרות (ADMIN::ensure_sessions_table, ועדכון המבנה בפאנל wizzo_update)
סוגי חיבורPDO (המומלץ). בקוד יש גם mysql (הרחבה שהוסרה מ-PHP), pg ו-clickhouse, וכולם לא מכוסים בתיעוד ההתקנה

שרת רשת#

הליבה מניחה front controller: כל בקשה שאינה קובץ אמיתי מגיעה ל-index.php בשורש האתר, וממנו ROUTER מפענח את הכתובת.

Apache (הנתמך)#

דרישהפירוט
mod_rewriteחובה. ה-.htaccess של האתר נשען על RewriteRule ו-RewriteCond
AllowOverrideחייב לאפשר .htaccess של האתר (AllowOverride All הוא הפשוט ביותר). בלי זה כל כתובת שאינה קובץ מחזירה 404 של השרת
Options -Indexesה-.htaccess של אתר הייחוס מכבה רשימת תיקיות
mod_expires, mod_deflate, mod_headersאופציונליות: משמשות לכותרות מטמון ודחיסה. ללא mod_expires כללי Expires* יגרמו לשגיאה, ולכן עטפו אותם ב-<IfModule> בשרת שאינו מוגדר כך
HTTPSה-.htaccess מפנה http ל-https ו-www לדומיין ללא www. תעודה צריכה להיות מותקנת לפני הכניסה הראשונה (או להסיר את שני הכללים בסביבת פיתוח)

התוכן המלא של .htaccess מופיע בהתקנת אתר חדש.

nginx (התאמה)#

התאמה ולא תצורה מאומתת

אתרי הייחוס רצים על Apache. תצורת ה-nginx בעמוד ההתקנה נגזרת ידנית מכללי ה-.htaccess ולא נבדקה מול אתר חי. שני דברים שלא להשמיט בה: חסימת system/market_settings.json (מכיל מפתחות API של שירותי Market) וחסימת system/config.php. ב-Apache שני אלה נחסמים בקובץ system/.htaccess ש-libraries/market_service.php כותב לבד. ב-nginx הקובץ הזה לא נאכף.

תיקיות וקבצים עם הרשאת כתיבה#

המשתמש שמריץ את PHP (ושמריץ גם את ה-cron) צריך לכתוב בנתיבים הבאים. הנתיבים יחסיים לשורש האתר.

נתיבלמהמקור
cache/ (או התיקייה ש-CONFIG_USER::$cache_folder מצביע עליה)מטמון הנתונים, מטמון עמודים מלא, קבצי minify ו-SCSS מקומפליםcollections/cache_engine.php (FILES::make_dir יוצר תת-תיקיות לפי הצורך)
cache/Smarty/templates_c/ ו-cache/Smarty/cache/קומפילציית Smarty. הנתיבים יחסיים לתיקיית העבודה ולא ל-$cache_folderFILES::create_smarty() ב-collections/FILES.php
media/העלאות (media/Storage) וקבצים זמניים של עיבוד תמונה (media/System/CropTmp)collections/STORAGE.php
system/market_settings.json וקבצי JSON של השירותים, system/.htaccess שהליבה כותבת, ותיקיות core_new_* ו-core_bup_* בזמן עדכון ליבהlibraries/market_service.php, admin/wizzo_update.php
שורש האתרעדכון ליבה מוריד את ה-ZIP לתיקיית העבודה (copy() עם שם הקובץ מה-URL). sqllog.txt נוצר שם כשמדליקים רישום SQLadmin/wizzo_update.php, collections/DB.php
/tmpMISC::ping() כותבת ל-/tmp/ping_errors.logcollections/MISC.php
התיקיות
cache/Smarty נפתרות לפי תיקיית העבודה נתיבי Smarty יחסיים. בבקשת רשת תיקיית העבודה היא שורש האתר, אך בהרצה מ-CLI היא התיקייה שבה הופעל הפקודה. לכן ה-crontab צריך לבצע cd לשורש האתר לפני php index.php, כמו בדוגמה שבהמשך.

Composer#

תיקיית vendor/ אינה חלק מהריפו וגם אין composer.lock. הליבה טוענת את החבילות ב-require מ-vendor/autoload.php (למשל PAGE::is_mobile(), שרצה בכל בקשה כש-allow_cache דלוק, וגם STORAGE, panel_table ו-cron_runner), ולכן אתר שנבנה מהריפו חייב להריץ composer install ב-system/core. אתר שמקבל את הליבה דרך עדכון ליבה מקבל vendor/ בתוך ה-ZIP.

חבילהגרסהשימוש
phpoffice/phpspreadsheet^1.23ייבוא וייצוא Excel
mobiledetect/mobiledetectlib^3.74זיהוי מובייל, מטמון עמודים נפרד לנייד
verot/class.upload.php^2.1העלאת קבצים ועיבוד תמונות
guzzlehttp/guzzle^7.8קריאות HTTP
dragonmantank/cron-expression^3.4חישוב ההרצה הבאה של משימות Cron
smalot/pdfparser^2.0קריאת PDF

Smarty 5 אינו מגיע מ-Composer: הוא כלול בליבה ב-addons/Smarty. פרטים על ניהול החבילות בפאנל: חבילות Composer.

Cron#

כל משימה מתוזמנת עוברת דרך controllers/cron_runner.php, שמופעל פעם בדקה מה-crontab של המערכת. ההפעלה היא קריאה ל-index.php עם ארגומנטים בצורה key=value:

* * * * * cd /var/www/site && php index.php url=system/cron_runner tk=<TOKEN> >/dev/null 2>&1

הסבר:

  • MISC::cli_check() מזהה הרצה מ-CLI, מפצל כל ארגומנט ב-=, מציב את url ב-$_SERVER["REQUEST_URI"] ואת השאר ב-$_GET.
  • tk חייב להיות שווה ל-CRM_params.cron_runner_token. הפאנל cron_manager יוצר אותו אוטומטית, והוא מציע שורת crontab מוכנה. שורת ההצעה שלו אינה כוללת cd, ולכן הוסיפו אותו בעצמכם (ראו האזהרה למעלה).
  • ב-CLI הליבה משתמשת בפלטפורמה הראשונה ב-CRM_platforms ומדלגת על בדיקת הדומיין (ignore_domain_check).
  • MISC::detect_cli_php() מחפשת בינארי של PHP ב-/usr/local/bin/php, /usr/bin/php ובנתיבי ea-php של cPanel. ה-CLI צריך את אותן הרחבות של ה-web.

פרטים נוספים: מנהל משימות (Cron).

רשת יוצאת#

השרת צריך לגשת ב-HTTPS החוצה (פורט 443) לשלושה תחומים:

יעדלמה
שרת ה-master של Wizzoבדיקת גרסה והורדת ליבה (קבוע MASTER ב-admin/wizzo_update.php), ראו עדכון ליבה
שירותי Wizzo Marketשירותים כמו דוא"ל, התראות ו-SEO, ראו Wizzo Market
ספקי AI ושירותים חיצונייםרק אם הפיצ'רים מופעלים, ראו סוכני AI

חסימת היציאה לא מפילה את האתר: היא משביתה עדכון ליבה, שירותי Market ופיצ'רי AI.

רשימת בדיקה לפני התקנה#

  1. php -v מציג 8.3 ומעלה, ב-web וב-CLI.
  2. php -m מציג pdo_mysql, mbstring, curl, zip, zlib, openssl, dom, libxml, ctype, gd.
  3. מסד MySQL או MariaDB ריק עם utf8mb4 ומשתמש עם הרשאות CREATE ו-ALTER.
  4. Apache עם mod_rewrite ו-AllowOverride All (או התאמה ל-nginx).
  5. composer זמין להתקנה בשרת (או ליצירת vendor/ על מכונה אחרת).
  6. הרשאת כתיבה ל-cache/, ל-media/ ול-system/.
  7. יציאה ב-HTTPS החוצה.

המשך: התקנת אתר חדש.

מצאתם טעות או חוסר? תקנו את הדף או פתחו Issue בריפו. התיעוד נכתב מתוך הקוד של ליבה 5.0.115.