Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用(客户端)javascript直接连接到Redis?_Php_Javascript_Mysql_Linux_Redis - Fatal编程技术网

Php 使用(客户端)javascript直接连接到Redis?

Php 使用(客户端)javascript直接连接到Redis?,php,javascript,mysql,linux,redis,Php,Javascript,Mysql,Linux,Redis,有没有一种方法可以使用客户端(而不是Node.js)javascript直接连接到Redis 我已经成功地将Node.js+PHP+Redis+Socket.io(用于客户端)用于一些项目。然而,我真的认为这可以进一步简化为类似PHP+Redis+Browser javascript的东西——去掉Node.js服务器,如果不需要的话,它只是另一个我不想使用的服务器。对于简单的事情,我认为使用Javascript直接连接到Redis会更好 据我所知,Redis只是通过一个端口提供其请求,因此任何能

有没有一种方法可以使用客户端(而不是Node.js)javascript直接连接到Redis

我已经成功地将Node.js+PHP+Redis+Socket.io(用于客户端)用于一些项目。然而,我真的认为这可以进一步简化为类似PHP+Redis+Browser javascript的东西——去掉Node.js服务器,如果不需要的话,它只是另一个我不想使用的服务器。对于简单的事情,我认为使用Javascript直接连接到Redis会更好

据我所知,Redis只是通过一个端口提供其请求,因此任何能够向该端口发出请求的语言都可以工作。从理论上讲,您不能使用客户端javascript点击redis服务器的端口吗

我最感兴趣的是发布/订阅功能,这可能是可能的,也可能是不可能的

我不确定您是否可以使用AJAX访问非端口80端口,但从技术上讲,您应该能够使用Nginx反向代理或其他方式将Redis的端口转发到端口80


有什么想法吗?只是一个想法。我对目前的解决方案非常满意,但想知道我们是否可以做得更好或更有效也无妨。

您只能使用客户端JavaScript以及在某些浏览器中使用WebSocket发出HTTP请求。然而,你应该调查一下。它为Redis添加了一个简单的HTTP/JSON层,并且应该完全满足您的需要


编辑:链接已修复。

我在php中有一堆预定义的redis访问器,我使用“路由器”风格的函数通过jQuery的$.post请求从客户端使用它们。路由器只是一个大交换机:

 public function router() {
$response = array();
switch ($_POST['method']) {
case 'get_whole_list': //is a convenience function with arg $list_key
  if ($_POST['list_key']) {//which will be provided by the POST request data
$response = $this->get_whole_list($_POST['list_key']);
break;
  } else {
$response = (array('error' => 'must be passed with post key "list_key"'));
break;
  } //and so on, until

//it's time to send the response: 
return json_encode(array('response' => $response));
}
然后您只需
echo$myClass->router()

我使用jQuery访问它,如下所示:

redgets.get_whole_list = function(key, callback) {
    $.post(redgets.router, //points to my php file
       {method: 'get_whole_list', //tells it what to do
       list_key: key}, //provides the required args
       function(data) {
           callback($.parseJSON(data).response); //parses the response
       });
这一切都很好;也许这并不理想,但它确实使node.js服务器变得多余。
我感到惊讶的是,还没有人制作过这种风格的通用redis界面。

真正的障碍是克服浏览器中ajax请求的非端口80/443限制;即使使用Webdis解决方案,因为它运行的端口是defaul的7379,如果运行的端口是80,它将与Apache或Nginx进程冲突

我的建议是使用nginx proxy_pass指向webdis进程。您可以将流量重定向到端口80并执行ajax请求,而不会出现令人讨厌的安全问题

下面是一个NGINX配置示例,它似乎可以帮我解决这个问题

upstream WebdisServerPool 
{
    server 127.0.0.1:7379; #webdis server1
    server 192.168.1.1:7379; #webdis server 2
}


server {

    listen   80; #
    root /path/to/my/php/code/;
    index index.php;
    server_name yourServerName.com;

    location ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ {
            expires max;
            log_not_found off;
    }

    location / {
            # Check if a file exists, or route it to index.php.
            try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME /path/to/my/php/code/$fastcgi_script_name;

    }

    location /redis {

            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            rewrite /(.*)/(.*)/(.*)$ /$2/$3 break; #ignore the /redis
             proxy_redirect off;
            proxy_pass http://webdisServerPool;
    }
}

在前端,这里是一个获取所有密钥的示例。所有redis请求都将通过/redis进行,例如:

$.ajax({ 
        url: "/redis/KEYS/*", 
        method: 'GET', 
        dataType: 'json', 
        success:function(data)
        {
            $each(data.KEYS,function(key,value){            
                $('body').append(key+"=>"+value+" <br> ");
            });
        }
});
$.ajax({
url:“/redis/KEYS/*”,
方法:“GET”,
数据类型:“json”,
成功:功能(数据)
{
$each(数据键、函数键、值){
$('body')。追加(key+“=>”+value+“
”); }); } });

您可以使用:


然后自己解析响应。

我发现direct Redis http接口不能很好地与pub/sub配合使用,或者很难设置(在撰写本文时)

以下是我基于predis示例的pub/sub“变通方法”


Webdis看起来很酷。我想知道在一个有多个用户数据的真实应用程序中,您将如何处理访问控制,或者这是否对全有/无访问级别最有用。我相信您正在链接到项目的一个分支。真正的网址是:谢谢你的评论!这是一个非常简单的解决方案,它确实有效。我认为像Webdis这样的东西更符合我的要求(绕过了PHP服务器/路由器的需求,这是PHP在IMO上做得不好的东西)。这种解决方法还有效吗?我跟随你的博客帖子,调用了你创建的php文件,并输入了你在帖子中显示的Ajax调用,但它超时了。ajax的成功函数从未被调用。有更新吗?另请参阅