PHP 可以透過 serialize()
將物件轉換成序列化文字資料後儲存在任何地方,需要使用的時候再透過 unserialize()
進行反序列化後得到原始物件,但因為序列化資料會記錄資料長度,因此如果想直接修改序列化資料的內容,需要連同資料長度也一起算進去,手動修改時麻煩且容易出錯。這時候可以透過 Serialized PHP Editor 這個 PHP 序列化資料線上編輯器進行修改就會方便很多。
[Ubuntu] 安裝 Apache HTTP Server 2.4 + PHP 7.1 + PHP-FPM
操作環境:
OS: Ubuntu Server 16.04.3 LTS amd64
Apache Version: 2.4.27
PHP Version: 7.1.8
Step 1. 更新 APT Source,取得最新版套件資訊
# 安裝software-properties-common (已安裝者可跳過此步驟)
sudo apt-get install -y software-properties-common
# 加入 Apache PPA
sudo add-apt-repository -y ppa:ondrej/apache2
# 加入 PHP PPA
sudo add-apt-repository -y ppa:ondrej/php
# 更新套件清單
sudo apt-get update
Read more “[Ubuntu] 安裝 Apache HTTP Server 2.4 + PHP 7.1 + PHP-FPM”
Leave a comment[PHP] Failed loading php_xdebug.dll
試用 PHPStorm 要設定 PHP Interpreter 時總是偵測不到 Xdebug,下指令時才發現載入發生錯誤
php -i | grep xdebug
Failed loading C:/Bitnami/wampstack-7.0.7-0/php/ext/php_xdebug.dll
WAMP 懶人包貌似沒裝好,懶得重新安裝,從 Stack Overflow 爬到了 Xdebug 官方有線上分析工具,可以幫忙進行 Xdebug 的除錯,並提供修正方法
連結: https://xdebug.org/wizard.php
使用方法很簡單 只需要在終端機下執行 php -i
,將輸出的 PHP Information 貼上即可
以此圖為例,網站直接提供了對應到 PHP 7.0.7 的 Xdebug extension DLL 檔,也會告知你應該放在哪個目錄下,php.ini 要做哪些修正,照著做後重新啟動服務,就解決了
References:
- Stack Overflow: XDebug not loading on Windows 7 64 bit PHP 5.4
- Xdebug: Support; Tailored Installation Instructions
[PHP] 強制清除所有session
透過調整以下三種參數去清除不太即時,且還要改回設定
- session.gc_probability
- session.gc_divisor
- session.gc_maxlifetime
Session預設是以檔案的形式存放在檔案系統中
透過刪除Session File也可以達到效果,且非常即時
缺點是無差別地圖砲,Server上所有網站的session都會被清掉
至於檔案是存放在/var/lib/php5
[email protected] [/var/lib/php5] [15:09] ls
total 148
drwxr-xr-x 6 root root 55 Mar 18 2016 modules
-rw------- 1 www-data www-data 0 Jan 11 15:03 sess_0ds3e4m3r7lgjooltl9a3l55c5
-rw------- 1 www-data www-data 0 Jan 11 15:05 sess_0pdn79vvlmk49pocsog0lm1s04
-rw------- 1 www-data www-data 21 Jan 11 14:52 sess_181m0vk41kg4jpbptqqkomvu45
-rw------- 1 www-data www-data 0 Jan 11 15:03 sess_22hv9nrcie1dgklni03ici5rg1
-rw------- 1 www-data www-data 0 Jan 11 15:07 sess_2jf0i4ld55pvov4d24s103rjh3
-rw------- 1 www-data www-data 21 Jan 11 14:50 sess_2u8fsfnkp9a1fanfa7qnemlpf5
-rw------- 1 www-data www-data 0 Jan 11 15:04 sess_43511pnkfu8vmmjk5uk5fa53f4
-rw------- 1 www-data www-data 21 Jan 11 14:45 sess_45a6khgkcq4irmvsg43ok8k766
-rw------- 1 www-data www-data 593 Jan 11 15:05 sess_4tpqknfnmt5k8mqq6g0ompmda5
-rw------- 1 www-data www-data 0 Jan 11 15:05 sess_6kdp8fepotp0v1krkv41dcqeu0
-rw------- 1 www-data www-data 512 Jan 11 14:52 sess_78h12laa6erhi4gsfa3l4s0h06
-rw------- 1 www-data www-data 488 Jan 11 15:07 sess_7u31csrpr889ubarhitom72ij6
-rw------- 1 www-data www-data 21 Jan 11 14:50 sess_8f2s5i1fb6v59t4rb0eenet682
-rw------- 1 www-data www-data 0 Jan 11 15:04 sess_8m5mov1o5mkjt7vuf0td0ilv53
(以下簡略...)
其中有個modules目錄是存放一些PHP的元件
記得不要手誤去刪到
刪掉所有Session Files
[email protected] [/var/lib/php5] [15:09] rm -f sess_*
[email protected] [/var/lib/php5] [15:09] ls
total 1
drwxr-xr-x 6 root root 55 Mar 18 2016 modules
重整網站後就會發現session全部都刷新了
Leave a comment[PHP] 利用flush()、ob_flush()強制輸出網頁內容
正常情況下,執行中的 PHP 過程中輸出的內容會先進到緩衝區 (output_buffer)
PHP Script 全部執行完畢後,產生的資料才會從 output_buffer 一次輸出到瀏覽器上
但是若程式要跑一段時間,想要看到執行過程中輸出的內容,可以透過 ob_flush()
+ flush()
達成
雖然看起來名稱很像,但是做的事情不太一樣:
ob_flush()
:把 PHP output_buffer (假設有打開)的東西輸出,但並不是立刻輸出到終端
flush()
:把非 PHP output_buffer,伺服器上準備輸出的資料輸出到瀏覽器上”顯示出來”
寫一小段測試 code
<?php
header('Content-type: text/html; charset=utf-8');
for ($i = 0; $i < 100; $i++) {
echo $i . '<br>';
flush();
ob_flush();
usleep(20000); // 20ms
}
HTTP Server 設定也會影響到 function
Apache 預設值不影響,不過 Nginx 會
所以如果 HTTP Server 使用 Nginx
需要針對 PHP 類型額外做設定:
編輯 /etc/nginx/site-available/default
# 找到針對PHP的directive
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_read_timeout 300;
# 加入這三行
fastcgi_keep_conn on; # fastcgi保持連線
proxy_buffering off; # 如果沒使用proxy的話這行可以不加
gzip off; # 關閉gzip壓縮
}
值得注意的是 fastcgi_keep_conn
在 Nginx 下預設是 off 的
雖然啟用後理論上效能能得到提升 (Connection TIME_WAIT 數量會明顯下降)
不過在某些特殊情況下可能會發生異常
所以預設情況下是關閉的
Leave a comment