PHP8適應
跳至導覽
跳至搜尋
jendo::Php7適應 在 wiki1231 的 分類:Etable 中
DSM
自 DSM 7.3 起停用 PHP 8.0(含 8.0) 以前的 PHP 套件
「Web Station / 指令碼語言設定 / PHP / 使用者定義 Default Profile PHP 8.1 / 編輯 / 擴充模組」
- 核取:
- curl,網路 / API,主動對外發送 HTTP / HTTPS / FTP 等請求(抓 API、下載檔案)
常見情境:呼叫 REST API(LINE、reCAPTCHA、Google、政府資料);下載遠端檔案、抓網頁內容 - gd,影像處理函式庫(生成、裁切、縮放、加浮水印、畫文字)
常見情境:圖片加字,如:drawword.php;上傳圖片後自動縮圖;產生驗證碼 - iconv,編碼 / 國際化,字元編碼轉換(如 UTF-8 ↔ Big5)
常見情境:相容於舊系統、CSV、政府資料;PHP 8.x 處理歷史 Big5 資料 - intl,編碼 / 國際化,處理語系、日期、數字、排序規則
常見情境:多語系網站;正確顯示各國日期格式;Unicode 排序(比 sort() 正確) - mysqli,資料庫,與 MySQL / MariaDB 溝通
常見情境:資料庫操作;支援 prepared statement(防 SQL injection) - openssl,加密、解密、憑證、HTTPS、金鑰處理
常見情境:HTTPS 憑證;JWT / OAuth;加密資料(AES、RSA) - pdo_mysql,資料庫,PDO(PHP Data Objects) 是一種 PHP 的資料庫抽象層 (Database Abstraction Layer),它提供了一個統一、一致的介面,讓 PHP 程式可以無縫地連接和操作不同的資料庫(如 MySQL, PostgreSQL, SQLite, SQL Server 等),而不需要針對特定資料庫寫不同的程式碼,核心價值是簡化多資料庫切換、提升程式的可攜性和可維護性。
常見情境:寫「可換資料庫」的程式;Laravel / 現代 PHP 框架;應該與 mysqli 擇一使用 - zlib,壓縮,gzip、deflate
常見情境:HTTP gzip 壓縮;壓縮檔處理;效能與頻寬優化
- curl,網路 / API,主動對外發送 HTTP / HTTPS / FTP 等請求(抓 API、下載檔案)
- 待核取
- bcmath,計算,高精度數學運算(避免浮點誤差)
- exif,影像,讀取圖片中的 EXIF 中繼資料
常見情境:照片拍攝時間;手機拍照方向;GPS 資訊 - ftp,網路 / API,FTP 協定上傳、下載、管理檔案
常見情境:舊系統;NAS ↔ 主機檔案同步(非加密);漸被 SSH/SFTP 取代 - posix,系統,存取 Unix / Linux 系統層級資訊
常見情境:取得使用者 UID / GID;CLI 工具、NAS 腳本;權限判斷 - sockets,網路 / API,底層網路通訊(TCP / UDP socket)
常見情境:即時通訊;自訂通訊協定;伺服器間低階連線 - ssh2,網路 / API,透過 SSH 連線遠端主機(含 SFTP)
常見情境:NAS 遠端部署;用 PHP 操作其他主機;安全檔案傳輸(取代 FTP) - xls,文件,讀寫 Excel(.xls)檔案的擴充或外掛
常見情境:匯入 / 匯出 Excel;舊版 Excel 檔案;⚠️ 多半會改用 PhpSpreadsheet 套件。 - zip,壓縮,建立與解壓縮 ZIP 檔案
常見情境:批次下載;備份資料;上傳後自動解壓
PHP8
套件名:PHP8.1
套件安裝後,主程式有三組路徑:
- 實體位置(實際存放路徑):/volume1/@appstore/PHP8.1/usr/local/bin/php81
解說:/分割名/@appstore/套件名/腳本用名 - 管理入口,DSM 管理套件框架的標準路徑:
- /var/packages/<套件名>/scripts 資料夾,用於啟停、升級腳本
- /var/packages/<套件名>/etc -> /volume1/@appconf/PHP8.1 資料夾,用於設定套件自己的狀態
- /var/packages/<套件名>/conf 資料夾,用於套件對外服務、可被其他系統引用的設定
- /var/packages/<套件名>/target -> /volume1/@appstore/PHP8.1 指向真正安裝位置的捷徑
- /var/packages/<套件名>/home -> /volume1/@apphome/PHP8.1
- /var/packages/<套件名>/share -> /volume1/@appshare/PHP8.1
- /var/packages/<套件名>/tmp -> /volume1/@apptemp/PHP8.1
- /var/packages/<套件名>/var -> /volume1/@appdata/PHP8.1
- /var/packages/<套件名>/INFO 檔案,「這是什麼套件」的靜態身分證,DSM 會用其中的資訊來:在套件中心顯示名稱 / 版本;判斷是否能啟動;判斷 CPU 架構是否相容…
- /var/packages/<套件名>/enabled 檔案,「目前是否啟用」的即時狀態旗標,表現「這個套件現在是不是開著?」,通常只是空檔案(或極小),存在 = 套件被啟用 / 不存在 = 套件被停用
- 使用入口,使用者腳本用名:
/usr/local/bin/php81 -> /var/packages/PHP8.1/target/usr/local/bin/php81 皆指向主程式
/usr/local/bin 之下放所有已安裝套件(含 PHP8.1 的已安裝套件)的執行捷徑
/usr/local/bin 通常在 PATH 中
PHP8.1 各擴充套件實際存放在 /volume1/@appstore/PHP8.1/usr/local/lib/php81/modules 之下的各 *.so
/volume1/@appstore/PHP8.1/usr/lib 則放各擴充套件的執行捷徑
不知道在哪兒
- mysqli_connect_errno() 本來就是「不接受任何參數」的函式,在 PHP 7.4 以前即使你多塞了一個 $connect ,PHP 仍「寬鬆容忍」→ 不報錯;在 PHP 8.0+ 參數數量嚴格檢查多給一個參數 → Fatal Error
Etable
- /et/class/wiki/wiki.php 中的第 240 行,PHP 7.4 以前,字串與陣列可以用 大括號 {} 取值,如:「$char = $str{3};」;但從 PHP 8.0 起,這種寫法 已被完全移除,只能用:「$char = $str[3];」取值。
- /et/class/database/etable.php 第 532 行,$this->fields[$i]["colflag"]=$fieldInfo->flag; => $this->fields[$i]["colflag"]=$fieldInfo->flags; 因為 mysqli_field 的實際屬性只有 flags 沒有 flag ,但 etable.php 的欄旗用法又和 flags 不一樣。此處待改,先解除報錯問題再講;怎麼調整欄旗的正確用法以後再說。
- PHP 8.1 已經「不再支援」用「與類別同名的方法」當建構子了。只有 __construct() 會在實體化時自動執行。所以
- /et/class/xoopsform 下面的各表單定義全改。
- /et/class/xoopsform/formelementtray.php 中的 function XoopsFormElementTray 不能改成建構子
- etable 的建構子要改
- login 的建構子要改
- /et/class/xoopsform/formdatetime-et.php 的第 67 行, $value[0] => $value[0]?? ,因為 $value 沒有被初始化(預設就是 null)
福留子孫
調外掛
- 修復 LinkedImages 外掛
- 調整 LocalSettings.php 內容
- 讓 images 中的圖檔瀏覽器可讀:DSM / File Station / images 資料夾 / 右鍵選單 / 內容 / 權限標籤 / 新增 http 群組 / 給全部讀取權限 / 套用到這個資料夾、子資料夾、檔案 / 儲存
- 重整頁「跳至頁首」
- 修復 /EmbedVideo/classes/VideoService.php 的 775 行
- $this->service['url_regex'] => ($this->service['url_regex']??[])
- $this->service['id_regex'] => ($this->service['id_regex']??[])
interwiki資料表
iw_prefix 欄,大寫改小寫
網路檔案櫃
- GfUploadFiles.php 的 if(($_SESSION['login_user']==$fileOwn['user']) => if(($_SESSION['login_user']===($fileOwn['user']??null))
- /uploadFiles/theme.php 修改以下部分:
- $_SESSION['checkin']==1 =>($_SESSION['checkin']??)==1
- $_REQUEST['act']=='uploadYTVedioForm' => ($_REQUEST['act']??)=='uploadYTVedioForm'
- $_REQUEST['act']=='addDirForm' => ($_REQUEST['act']??)=='addDirForm'
- $_REQUEST['sessionDestroy']!=1 => ($_REQUEST['sessionDestroy']??)!=1
- /uploadFiles/index.php 待全面部署,已修改以下部分:
- $omitLogin!=1 => ($omitLogin??)!=1
振鐸官網
- /jendo/theme.php 的第 120 行,PHP 7.x 以前:mktime() 允許不帶參數,等同於「現在時間」;但從 PHP 8.0 起:mktime() 👉 不再允許 0 參數呼叫;改用 date('Y-m-d'); 📌 date() 在未指定第二個參數時,預設就是使用目前時間。