העמוד הזה מרכז מה שהשרת צריך לספק לפני שהתקנת אתר חדש מתחילה. כל שורה נגזרת מהקוד של הליבה. הליבה חיה ב-api/core/ בריפו ונפרסת ל-system/core/ באתר, ולכן נתיבי הליבה בטבלאות כתובים יחסית ל-api/core.
PHP#
| דרישה | ערך | מקור בקוד |
|---|---|---|
| גרסת PHP | 8.3 ומעלה | composer.json מגדיר config.platform.php = "8.3". מנגנון העדכון (controllers/check_version.php, php_floor()) מחזיר ברירת מחדל 8.3, ו-admin/wizzo_update.php מסרב להחליף ליבה בשרת שגרסת ה-PHP שלו נמוכה מהרצפה (php_too_old) |
| SAPI | Apache (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_errors | Off בפרודקשן | הליבה כותבת שגיאות ל-error_log |
ליבה שדורשת 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_folder | FILES::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 נוצר שם כשמדליקים רישום SQL | admin/wizzo_update.php, collections/DB.php |
/tmp | MISC::ping() כותבת ל-/tmp/ping_errors.log | collections/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.
רשימת בדיקה לפני התקנה#
php -vמציג 8.3 ומעלה, ב-web וב-CLI.php -mמציגpdo_mysql,mbstring,curl,zip,zlib,openssl,dom,libxml,ctype,gd.- מסד MySQL או MariaDB ריק עם
utf8mb4ומשתמש עם הרשאותCREATEו-ALTER. - Apache עם
mod_rewriteו-AllowOverride All(או התאמה ל-nginx). composerזמין להתקנה בשרת (או ליצירתvendor/על מכונה אחרת).- הרשאת כתיבה ל-
cache/, ל-media/ול-system/. - יציאה ב-HTTPS החוצה.
המשך: התקנת אתר חדש.