其实你要做的是一个常驻内存的队列,按请求先后做排队处理.
单机上可以试试Linux内存文件系统(tmpfs)上/dev/shm读写SQLite.
读文件不需要经过网络,也不需要自己实现内存常驻,锁,自增以及唯一约束.
header('Content-Type: text/plain; charset=utf-8');
// sudo mkdir -m 777 /dev/shm/app
$file = '/dev/shm/app/data.db3';
$ddl = "
BEGIN;
CREATE TABLE IF NOT EXISTS queue (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER
);
CREATE UNIQUE INDEX IF NOT EXISTS queue_user_id_idx ON queue(user_id);
COMMIT;
";
if(!file_exists($file)) {
//多核下多进程并发时可能都会进入到这个判断分支,所以DDL中要用IF NOT EXISTS
$db = new PDO('sqlite:'.$file);
$db->exec($ddl); // pdo_sqlite 的 query 和 prepare 不支持一次执行多条SQL语句
} else {
$db = new PDO('sqlite:'.$file);
}
$stmt = $db->prepare('INSERT INTO queue(user_id) VALUES(?)');
$stmt->execute(array(time())); //time()换成你的用户ID
echo $stmt->rowCount()."\n"; //查询中受影响(改动)的行数,插入失败时为0
echo $db->lastInsertId(); //插入的自增ID,插入失败时为0
// php -S 127.0.0.1:8080 -t /home/eechen/www >/dev/null 2>&1 &
// ab -c100 -n1000 http://127.0.0.1:8080/