2024 年日本 PHP 研討會

基本用法

範例 #1 memcache 擴充功能概述範例

在此範例中,一個物件被儲存在快取中,然後再被取回。物件和其他非純量類型在儲存之前會被序列化,因此無法將資源(例如連線識別碼和其他)儲存在快取中。

<?php

$memcache
= new Memcache;
$memcache->connect('localhost', 11211) or die ("無法連線");

$version = $memcache->getVersion();
echo
"伺服器版本:".$version."<br/>\n";

$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;

$memcache->set('key', $tmp_object, false, 10) or die ("儲存資料至伺服器失敗");
echo
"資料已儲存至快取 (資料將於 10 秒後過期)<br/>\n";

$get_result = $memcache->get('key');
echo
"來自快取的資料:<br/>\n";

var_dump($get_result);

?>

範例 #2 使用 memcache 作為 session 處理器

<?php

$session_save_path
= "tcp://$host:$port?persistent=1&weight=2&timeout=2&retry_interval=10, ,tcp://$host:$port ";
ini_set('session.save_handler', 'memcache');
ini_set('session.save_path', $session_save_path);

?>

新增註解

使用者貢獻的註解 2 則註解

5
atesin > gmail
4 年前
memcached 非常棒,速度極快,用途廣泛且實用,可擴展,是許多專案必備的工具

但如果您只是想要速度來盡量減少 session 檔案的阻塞,還有一個不錯的替代方案,tmpfs

https://eddmann.com/posts/storing-php-sessions-file-caches-in-memory-using-tmpfs/

如果您使用 Debian,/tmp 中可能已經有 session 目錄(掛載為 tmpfs),但要注意每日的清理程序可能會影響您的 session。

如果您使用 CentOS/其他系統(像我一樣),或者即使您使用 Debian 但想擺脫 /tmp 清理任務,可以使用這個技巧。

我發現我的系統中 /run 也掛載為 tmpfs,所以我關閉了 php-fpm,將我的 PHP session 目錄移至 /tmp/,重新配置 PHP,然後再次啟動...(您可以根據您的情況調整)。

systemctl stop php-fpm
cp -a /var/lib/php/session /tmp/php-session
vim /etc/php-fpm.d/www.conf
------
php_value[session.save_path] = /run/php-session
------
systemctl start php-fpm

唯一的缺點是 tmpfs 是揮發性的,就像 memcached 一樣(卸載/關機/斷電時數據會丟失),為了規避這種風險,我編寫了另一個服務,在 PHP 啟動/停止之前/之後恢復/備份 PHP session 目錄...(未經測試!)

vim /etc/systemd/system/php-session-backup.service
------
# 讓 tmpfs PHP sessions 持久化的基本設定

[Unit]
Description=在關機/開機時備份/還原 PHP tmpfs sessions
Before=php-fpm.service

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=rm -fr /run/php-session
ExecStart=cp -fa /var/lib/php/session /run/php-session
ExecStop=rm -fr /var/lib/php/session
ExecStop=cp -fa /run/php-session /var/lib/php/session

[Install]
WantedBy=multi-user.target
------
systemctl enable php-session-backup

您也可以搭配每日備份任務,以防系統崩潰,這樣您只會損失一天的資料。

crontab -e
------
0 4 * * * rm -fr /var/lib/php/session;cp -fa /run/php-session /var/lib/php/session
------

不過,這非常粗糙,您可以更好地使用 inotify + rsync,可以從這裡獲得一些想法:

https://blog.jmdawson.co.uk/persistent-ramdisk-on-debain-ubuntu/
-1
atesin > gmail
4 年前
版主請合併這些貼文

我於 2020-07-28 01:05 關於 tmpfs session 目錄的評論的勘誤...

我用來安裝 session 檔案的 tmpfs 目錄是「/run」而不是「/tmp」... 因為 /tmp 有時會自動(或手動)刪除。
To Top