热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php-linux-环境-开发-Linux下php使用Pusher遇到一个难题

最近在给赏金猎人做新的网站的时候想使用Pusher做一个首页的吐嘈,我在本地测试都ok之后将它部署到了Linux上,可是打开之后却发现没法实现消息发出,打开Pusher的控制台察看信息是显示通道连接了,但是发送消息...

最近在给赏金猎人做新的网站的时候想使用 Pusher 做一个首页的吐嘈,我在本地测试都ok之后将它部署到了Linux上,可是打开之后却发现没法实现消息发出,打开Pusher的控制台察看信息是显示通道连接了,但是发送消息的事件没有执行。我打开本地的(本地的和部署的使用同一个Pusher应用),本地发的东西可以显示在部署的那个上面。看了半天都没找到问题所在。

整个项目的结构如下:

main.js 文件内容:

(function($){
    var pusher  = new Pusher('18f9924cb7ee44a01ec0'),
        channel = pusher.subscribe('imgondar');
    Pusher.log = function( msg ) {
        if( console && console.log ) {
            console.log( msg );
        }
    };
    channel.bind('send_message', function (data) {
        Snarl.addNotification({
            title: data.name,
            text: data.msg,
            timeout: 5000
        });
    });
    $('form').submit(function(){
        var say = $('#message').val();
        if ( say ) {
            $.post('post.php', $(this).serialize());
            $('#message').val('').focus();
        }
        return false;
    });
})(jQuery);

post.php 文件内容:

 htmlentities( getName().':' ),
    'msg'  => htmlentities(strip_tags($_REQUEST['message'])),
);
$pusher->trigger('imgondar', 'send_message', $data);

function getName(){
    $name_array = array(0 => "小龙女",1 => "杨过",2 => "金庸",3 => "郭靖",4 => "黄蓉",5 => "欧阳锋",6 => "段誉",7 => "语嫣",8 => "虚竹",9 => "牧尘",10 => "Java",11 => "Javascript",12 => "Python",13 => "C++",
        14 => "HTML",15 => "什么鬼~~",16 => "想不出来了^^",17 => "阿列",18 => "就是想吐槽",19 => "路人甲",20 => "路人乙",21 => "跑龙套",22 => "主角",23 => "我是女主",24 => "我只是奴婢",25 => "请叫我容嬷嬷",26 => "我会降龙十八掌",27 => "小白",28 => "无语了!-_-",29 => "乔峰",30 => "不良人",
    );

    $index = rand(0, count($name_array)-1);
    return $name_array[$index];
}

本地http://127.0.0.1/imgondarv8_test/访问之后点击发送,在浏览器看到如下效果:

因为我在 main.js 代码中让其输出日志,打开浏览器的控制台看到:

打开Pusher的控制台:

现在问题来了,我把通过 svn 把代码部署到了Linux服务器上,通过如下域名访问:
http://testgondar.helloarron.com/

点击发送后没有效果,Pusher控制台和浏览器控制台信息如下:


虽然连接了但是消息没有发送成功。

但是我用本地的 http://127.0.0.1/imgondarv8_test/ 发消息可以在部署好的那个什么接收到(毕竟使用的是同一个Pusher 应用),在浏览器控制台显示接受到的信息:

测试了半天就是post.php里面的$pusher->trigger('imgondar', 'send_message', $data);在Linux下面没有执行。

查看了Pusher.php文件的trigger函数:

public function trigger ( $channel, $event, $payload, $socket_id = null, $debug = false, $already_encoded = false )
{
    $ch = curl_init();
    if ( $ch === false ){
        die( 'Could not initialise cURL!' );
    }
    # Add channel to URL..
    $s_url = $this->settings['url'] . '/channels/' . $channel . '/events';
    # Build the request
    $signature = "POST\n" . $s_url . "\n";
    $payload_encoded = $already_encoded ? $payload : json_encode( $payload );
    $query = "auth_key=" . $this->settings['auth_key'] . "&auth_timestamp=" . time() . "&auth_version=1.0&body_md5=" . md5( $payload_encoded ) . "&name=" . $event;
    # Socket ID set?
    if ( $socket_id !== null ){
        $query .= "&socket_id=" . $socket_id;
    }

    # Create the signed signature...
    $auth_signature = hash_hmac( 'sha256', $signature . $query, $this->settings['secret'], false );
    $signed_query = $query . "&auth_signature=" . $auth_signature;
    $full_url = $this->settings['server'] . ':' . $this->settings['port'] . $s_url . '?' . $signed_query;

    # Set cURL opts and execute request
    curl_setopt( $ch, CURLOPT_URL, $full_url );
    curl_setopt( $ch, CURLOPT_HTTPHEADER, array ( "Content-Type: application/json" ) );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt( $ch, CURLOPT_POST, 1 );
    curl_setopt( $ch, CURLOPT_POSTFIELDS, $payload_encoded );
    curl_setopt( $ch, CURLOPT_TIMEOUT, $this->settings['timeout'] );
    $respOnse= curl_exec( $ch );
    curl_close( $ch );
    if ( $respOnse== "202 ACCEPTED\n" && $debug == false ){
        return true;
    } elseif ( $debug == true || $this->settings['debug'] == true ) {
        return $response;
    } else {
        return false;
    }
}

我觉得可能是linux下的php环境没有开启curl模块,于是自己写了一个简单的抓取百度首页的例子,发现服务器上的curl是开启的。实在是找不到其他原因了,还请大神们给支支招。谢谢^^

回复内容:

最近在给赏金猎人做新的网站的时候想使用 Pusher 做一个首页的吐嘈,我在本地测试都ok之后将它部署到了Linux上,可是打开之后却发现没法实现消息发出,打开Pusher的控制台察看信息是显示通道连接了,但是发送消息的事件没有执行。我打开本地的(本地的和部署的使用同一个Pusher应用),本地发的东西可以显示在部署的那个上面。看了半天都没找到问题所在。

整个项目的结构如下:

main.js 文件内容:

(function($){
    var pusher  = new Pusher('18f9924cb7ee44a01ec0'),
        channel = pusher.subscribe('imgondar');
    Pusher.log = function( msg ) {
        if( console && console.log ) {
            console.log( msg );
        }
    };
    channel.bind('send_message', function (data) {
        Snarl.addNotification({
            title: data.name,
            text: data.msg,
            timeout: 5000
        });
    });
    $('form').submit(function(){
        var say = $('#message').val();
        if ( say ) {
            $.post('post.php', $(this).serialize());
            $('#message').val('').focus();
        }
        return false;
    });
})(jQuery);

post.php 文件内容:

 htmlentities( getName().':' ),
    'msg'  => htmlentities(strip_tags($_REQUEST['message'])),
);
$pusher->trigger('imgondar', 'send_message', $data);

function getName(){
    $name_array = array(0 => "小龙女",1 => "杨过",2 => "金庸",3 => "郭靖",4 => "黄蓉",5 => "欧阳锋",6 => "段誉",7 => "语嫣",8 => "虚竹",9 => "牧尘",10 => "Java",11 => "Javascript",12 => "Python",13 => "C++",
        14 => "HTML",15 => "什么鬼~~",16 => "想不出来了^^",17 => "阿列",18 => "就是想吐槽",19 => "路人甲",20 => "路人乙",21 => "跑龙套",22 => "主角",23 => "我是女主",24 => "我只是奴婢",25 => "请叫我容嬷嬷",26 => "我会降龙十八掌",27 => "小白",28 => "无语了!-_-",29 => "乔峰",30 => "不良人",
    );

    $index = rand(0, count($name_array)-1);
    return $name_array[$index];
}

本地http://127.0.0.1/imgondarv8_test/访问之后点击发送,在浏览器看到如下效果:

因为我在 main.js 代码中让其输出日志,打开浏览器的控制台看到:

打开Pusher的控制台:

现在问题来了,我把通过 svn 把代码部署到了Linux服务器上,通过如下域名访问:
http://testgondar.helloarron.com/

点击发送后没有效果,Pusher控制台和浏览器控制台信息如下:


虽然连接了但是消息没有发送成功。

但是我用本地的 http://127.0.0.1/imgondarv8_test/ 发消息可以在部署好的那个什么接收到(毕竟使用的是同一个Pusher 应用),在浏览器控制台显示接受到的信息:

测试了半天就是post.php里面的$pusher->trigger('imgondar', 'send_message', $data);在Linux下面没有执行。

查看了Pusher.php文件的trigger函数:

public function trigger ( $channel, $event, $payload, $socket_id = null, $debug = false, $already_encoded = false )
{
    $ch = curl_init();
    if ( $ch === false ){
        die( 'Could not initialise cURL!' );
    }
    # Add channel to URL..
    $s_url = $this->settings['url'] . '/channels/' . $channel . '/events';
    # Build the request
    $signature = "POST\n" . $s_url . "\n";
    $payload_encoded = $already_encoded ? $payload : json_encode( $payload );
    $query = "auth_key=" . $this->settings['auth_key'] . "&auth_timestamp=" . time() . "&auth_version=1.0&body_md5=" . md5( $payload_encoded ) . "&name=" . $event;
    # Socket ID set?
    if ( $socket_id !== null ){
        $query .= "&socket_id=" . $socket_id;
    }

    # Create the signed signature...
    $auth_signature = hash_hmac( 'sha256', $signature . $query, $this->settings['secret'], false );
    $signed_query = $query . "&auth_signature=" . $auth_signature;
    $full_url = $this->settings['server'] . ':' . $this->settings['port'] . $s_url . '?' . $signed_query;

    # Set cURL opts and execute request
    curl_setopt( $ch, CURLOPT_URL, $full_url );
    curl_setopt( $ch, CURLOPT_HTTPHEADER, array ( "Content-Type: application/json" ) );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt( $ch, CURLOPT_POST, 1 );
    curl_setopt( $ch, CURLOPT_POSTFIELDS, $payload_encoded );
    curl_setopt( $ch, CURLOPT_TIMEOUT, $this->settings['timeout'] );
    $respOnse= curl_exec( $ch );
    curl_close( $ch );
    if ( $respOnse== "202 ACCEPTED\n" && $debug == false ){
        return true;
    } elseif ( $debug == true || $this->settings['debug'] == true ) {
        return $response;
    } else {
        return false;
    }
}

我觉得可能是linux下的php环境没有开启curl模块,于是自己写了一个简单的抓取百度首页的例子,发现服务器上的curl是开启的。实在是找不到其他原因了,还请大神们给支支招。谢谢^^

那位大神帮我解决一下啊,急需

看下你的php代码是否有执行权限!

curl问题 其实你打开Puser.php调试模式 会发现返回的status=0
只要在Pusher.php里trigger方法curl那块加上

curl_setopt($ch,    CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,    CURLOPT_SSL_VERIFYHOST,false);

这样就可以了

推荐阅读
  • 腾讯安全平台部招聘安全工程师和数据分析工程师
    腾讯安全平台部正在招聘安全工程师和数据分析工程师。安全工程师负责安全问题和安全事件的跟踪和分析,提供安全测试技术支持;数据分析工程师负责安全产品相关系统数据统计和分析挖掘,通过用户行为数据建模为业务决策提供参考。招聘要求包括熟悉渗透测试和常见安全工具原理,精通Web漏洞,熟练使用多门编程语言等。有相关工作经验和在安全站点发表作品的候选人优先考虑。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 众筹商城与传统商城的区别及php众筹网站的程序源码
    本文介绍了众筹商城与传统商城的区别,包括所售产品和玩法不同以及运营方式不同。同时还提到了php众筹网站的程序源码和方维众筹的安装和环境问题。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 本文介绍了如何使用jQuery和AJAX来实现动态更新两个div的方法。通过调用PHP文件并返回JSON字符串,可以将不同的文本分别插入到两个div中,从而实现页面的动态更新。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • Java源代码安全审计(二):使用Fortify-sca工具进行maven项目安全审计
    本文介绍了使用Fortify-sca工具对maven项目进行安全审计的过程。作者通过对Fortify的研究和实践,记录了解决问题的学习过程。文章详细介绍了maven项目的处理流程,包括clean、build、Analyze和Report。在安装mvn后,作者遇到了一些错误,并通过Google和Stack Overflow等资源找到了解决方法。作者分享了将一段代码添加到pom.xml中的经验,并成功进行了mvn install。 ... [详细]
  • 本文介绍了在满足特定条件时如何在输入字段中使用默认值的方法和相应的代码。当输入字段填充100或更多的金额时,使用50作为默认值;当输入字段填充有-20或更多(负数)时,使用-10作为默认值。文章还提供了相关的JavaScript和Jquery代码,用于动态地根据条件使用默认值。 ... [详细]
  • 本文介绍了DataTables插件的官方网站以及其基本特点和使用方法,包括分页处理、数据过滤、数据排序、数据类型检测、列宽度自动适应、CSS定制样式、隐藏列等功能。同时还介绍了其易用性、可扩展性和灵活性,以及国际化和动态创建表格的功能。此外,还提供了参数初始化和延迟加载的示例代码。 ... [详细]
  • 本文介绍了iOS开发中检测和解决内存泄漏的方法,包括静态分析、使用instruments检查内存泄漏以及代码测试等。同时还介绍了最能挣钱的行业,包括互联网行业、娱乐行业、教育行业、智能行业和老年服务行业,并提供了选行业的技巧。 ... [详细]
author-avatar
幽默的人生就是悲催基_129
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有