php 实现并发同步
PHP 实现并发同步的方法
PHP 本身是单线程语言,但可以通过多种方式实现并发同步处理。以下是几种常见的方法:
多进程处理(PCNTL 扩展)
使用 pcntl_fork 创建多个子进程并行处理任务。父进程可以等待所有子进程完成后再继续执行。
$pids = [];
$processNum = 3;
for ($i = 0; $i < $processNum; $i++) {
$pid = pcntl_fork();
if ($pid == -1) {
die('Could not fork');
} else if ($pid) {
$pids[] = $pid;
} else {
// 子进程执行代码
sleep(1);
exit(0);
}
}
foreach ($pids as $pid) {
pcntl_waitpid($pid, $status);
}
使用消息队列
通过 msg_get_queue 创建系统消息队列,不同进程可以通过消息队列进行通信和同步。
$key = ftok(__FILE__, 'a');
$queue = msg_get_queue($key, 0666);
if (msg_send($queue, 1, 'Message content')) {
echo "Message sent\n";
}
if (msg_receive($queue, 0, $msgtype, 1024, $message)) {
echo "Received: $message\n";
}
共享内存与信号量
使用 shmop 扩展和 semaphore 实现进程间共享数据和同步。
$key = ftok(__FILE__, 'a');
$sem = sem_get($key);
$shm = shmop_open($key, "c", 0644, 100);
sem_acquire($sem);
// 临界区代码
shmop_write($shm, str_pad('data', 100, "\0"), 0);
sem_release($sem);
文件锁同步
通过 flock 实现文件级别的锁机制,确保同一时间只有一个进程可以访问共享资源。
$fp = fopen("/tmp/lock.txt", "w+");
if (flock($fp, LOCK_EX)) {
// 排他锁
fwrite($fp, "Write something\n");
flock($fp, LOCK_UN);
} else {
echo "Couldn't get the lock!";
}
fclose($fp);
数据库事务
使用数据库事务确保数据操作的原子性和一致性。
$db = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$db->beginTransaction();
try {
$db->exec("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1");
$db->exec("UPDATE accounts SET balance = balance + 100 WHERE user_id = 2");
$db->commit();
} catch (Exception $e) {
$db->rollBack();
}
第三方工具
对于更复杂的并发需求,可以考虑使用以下工具:

- Gearman:分布式任务调度系统
- RabbitMQ:消息队列系统
- Swoole:PHP 协程框架
- ReactPHP:事件驱动框架
这些方法各有优缺点,选择哪种方案取决于具体应用场景和性能需求。对于简单的同步需求,文件锁或数据库事务可能足够;对于高性能并发场景,可能需要考虑专门的并发框架或服务。






