【问题标题】:How to make a PHP script react in real time to a database insertion?如何使 PHP 脚本实时响应数据库插入?
【发布时间】:2016-03-15 01:12:09
【问题描述】:

我有多个 PHP 脚本 24/7 运行,每个都在不同的机器上,从 Internet 获取有关用户的信息。

这些用户位于 (postgresql) 数据库的表中。每次有新用户在应用程序中注册时,都会在表中插入一条新记录,将其分配给当前正在运行的 PHP 脚本之一(平均分配负载)。

有没有办法让分配给它的 PHP 脚本能够实时做出反应,以便立即开始获取有关用户的信息?

(我当前的设置是每个 PHP 脚本每 1 分钟查询一次表,并检查是否已将新用户分配给它......但更频繁的查询会增加数据库负载,并且在那 1 分钟的窗口中我没有从新添加的用户那里获取信息。)

【问题讨论】:

  • 简短的回答,“不”。长答案,开始看 Node.js。
  • 查看 LISTENNOTIFY 的 postgres 手册。
  • 顺便说一句,你为什么用mysql标记这个问题?
  • 我也对MySQL 的可能解决方案感兴趣,以防万一有一个超级简单的方法来完成这个。

标签: php mysql postgresql ipc


【解决方案1】:

【讨论】:

  • 但我仍然需要每 1 分钟致电 pg_get_notify() 以查看是否已发出新通知,不是吗?我认为这比查询表更轻量级,并且可以增加轮询频率?
  • @hallaplay835 不,您不需要每分钟都调用它。它将阻止脚本执行,直到收到通知。如果您不想阻止脚本,那么有一些解决方法需要轮询套接字。无论如何,只是谷歌的例子。 LISTEN/NOTIFY 绝对是 PostgreSQL 实时事件的一种方式。
【解决方案2】:

SQL 触发器 启动 sys_exec() 触发 HTTP 请求?但这似乎有点矫枉过正。

DELIMITER $$

CREATE TRIGGER `test_after_insert` AFTER INSERT ON `test`
FOR EACH ROW BEGIN

SET @exec_var = sys_exec('/usr/bin/php /myApp/after_insert.php')
END;
$$

DELIMITER ;

我知道这不是 postgres 脚本,但它应该可以工作。

--- 编辑 ---

after_insert.php 之后:

function httpPost($url, $data)
{
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($curl);
    curl_close($curl);
    return $response;
}

来源: How to make an HTTP Post

【讨论】:

  • 这将启动after_insert.php... 它将发出一个HTTP 请求?所以 HTTP 请求被发送到最初运行 PHP 脚本所在的机器上……它会如何被警告?
  • 嗯,是的,为什么不呢? SQL 触发器 -> sys_exec -> after_insert.php -> http 发布到您的远程脚本。我会更新我的答案
  • 我的 PHP 脚本 A.php 在没有 Web 服务器的机器上运行。如果我安装了一个,该请求将由另一个 PHP 脚本B.php 处理,该脚本必须以某种方式与A 通信。如何? Inter-process communication?也许是tick handler?你确定这比连续查询表更有效吗?
  • 我建议避免使用依赖于外部程序执行的此类解决方案。它不安全、不高效、不便携且不酷!请改用LISTEN/NOTIFY 功能。
  • 我认为它是最高效的@pumbo,可能并不酷,但高效、便携且安全。比指向选择查询的开放端点更安全。为什么不安装网络服务器?您只需在A 服务器上的iptables 中添加一个条目,该服务器接收来自A 的IP 和nginx 的查询,从而公开您的B.php 脚本。也许我不太明白这个问题......没有 IPC 或刻度处理程序可以使用......
猜你喜欢
  • 2011-01-01
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 2015-12-05
  • 2012-03-27
  • 2019-09-13
  • 1970-01-01
  • 2012-11-10
相关资源
最近更新 更多