php实现监听
监听文件变化
在PHP中实现文件监听可以通过inotify扩展完成。该扩展基于Linux内核的文件系统事件监控机制,能够实时检测文件或目录的变更。
安装inotify扩展:
pecl install inotify
基础监听示例:
$fd = inotify_init();
$watch_descriptor = inotify_add_watch($fd, '/path/to/dir', IN_MODIFY);
while (true) {
$events = inotify_read($fd);
foreach ($events as $event) {
echo "File {$event['name']} was modified\n";
}
}
监听端口连接
使用socket扩展可以创建TCP服务监听指定端口:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);
while ($client = socket_accept($socket)) {
$input = socket_read($client, 1024);
echo "Received: $input";
socket_write($client, "HTTP/1.1 200 OK\r\n\r\nHello");
socket_close($client);
}
监听数据库变更
通过MySQL的binlog可以实现数据库变更监听:
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$pdo->exec("SET GLOBAL binlog_format = 'ROW'");
$stmt = $pdo->query("SHOW BINARY LOGS");
while ($log = $stmt->fetch()) {
// 处理binlog变更
}
事件驱动监听
使用libevent或ReactPHP实现事件驱动监听:

ReactPHP示例:
$loop = React\EventLoop\Factory::create();
$socket = new React\Socket\Server('127.0.0.1:8080', $loop);
$socket->on('connection', function ($conn) {
$conn->on('data', function ($data) use ($conn) {
$conn->write("Echo: $data");
});
});
$loop->run();
进程间通信监听
通过消息队列实现进程通信监听:
$queue = msg_get_queue(ftok(__FILE__, 'a'));
msg_receive($queue, 0, $msgtype, 1024, $message);
echo "Received message: $message";
定时任务监听
使用pcntl和ticks实现定时监听:
declare(ticks=1);
pcntl_signal(SIGALRM, function() {
echo "Timer triggered\n";
pcntl_alarm(5); // 每5秒触发
});
pcntl_alarm(5); // 初始触发
每种监听方式适用于不同场景,文件监听适合日志分析,端口监听适合构建服务,数据库监听适合数据同步,事件驱动适合高并发场景,进程通信适合分布式系统,定时任务适合周期检测。






