php实现监听
PHP 实现监听的方法
在 PHP 中实现监听功能可以通过多种方式完成,具体取决于监听的目标和应用场景。以下是几种常见的实现方法:
文件系统监听
使用 inotify 扩展可以监听文件系统的变化。该扩展提供了对 Linux 内核 inotify 功能的访问,能够监控文件或目录的变化。
$fd = inotify_init();
$watch_descriptor = inotify_add_watch($fd, '/path/to/directory', IN_MODIFY | IN_CREATE | IN_DELETE);
while (true) {
$events = inotify_read($fd);
foreach ($events as $event) {
echo "File {$event['name']} was {$event['mask']}\n";
}
}
网络端口监听
使用 socket 函数可以创建一个简单的 TCP 服务器监听指定端口。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);
while (true) {
$client = socket_accept($socket);
$input = socket_read($client, 1024);
echo "Received: $input";
socket_write($client, "OK");
socket_close($client);
}
数据库监听
某些数据库如 MySQL 支持触发器或事件监听,可以通过查询数据库日志或使用轮询机制实现监听。
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->query("SELECT * FROM table WHERE updated_at > NOW() - INTERVAL 1 MINUTE");
while ($row = $stmt->fetch()) {
echo "New record: {$row['id']}\n";
}
消息队列监听
使用消息队列系统如 RabbitMQ 或 Redis 可以实现高效的异步监听。
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->subscribe(['channel'], function ($redis, $channel, $message) {
echo "Received message: $message\n";
});
进程间通信监听
通过共享内存或信号量可以实现进程间的通信监听。
$shm_key = ftok(__FILE__, 't');
$shm_id = shmop_open($shm_key, "c", 0644, 100);
while (true) {
$data = shmop_read($shm_id, 0, 100);
if (trim($data)) {
echo "Received: $data\n";
shmop_write($shm_id, str_repeat("\0", 100), 0);
}
sleep(1);
}
注意事项
- 长时间运行的监听脚本需要考虑内存泄漏和异常处理。
- 文件系统监听需要服务器支持
inotify扩展。 - 网络监听需要考虑安全性和并发处理。
- 数据库监听可能对性能有影响,建议合理设置轮询间隔。







