Heim  >  Artikel  >  Backend-Entwicklung  >  php-linux-环境-开发 - Linux 下php使用 Pusher 遇到一个难题

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

WBOY
WBOYOriginal
2016-06-06 20:37:201118Durchsuche

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

整个项目的结构如下:
php-linux-环境-开发 - Linux 下php使用 Pusher 遇到一个难题

main.js 文件内容:

<code>(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);

</code>

post.php 文件内容:

<code><?php require './lib/Pusher.php';

$app_id = '111087';
$app_key = '18f9924cb7ee44a01ec0';
$app_secret = '09c7dd1a71a92c90ce2d';
$pusher = new Pusher($app_key, $app_secret, $app_id);

$data = array(
    'name' => 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];
}
</code>

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

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

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

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

打开Pusher的控制台:

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

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

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

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

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

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

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

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

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

<code>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;
    }
}
</code>

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

回复内容:

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

整个项目的结构如下:
php-linux-环境-开发 - Linux 下php使用 Pusher 遇到一个难题

main.js 文件内容:

<code>(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);

</code>

post.php 文件内容:

<code><?php require './lib/Pusher.php';

$app_id = '111087';
$app_key = '18f9924cb7ee44a01ec0';
$app_secret = '09c7dd1a71a92c90ce2d';
$pusher = new Pusher($app_key, $app_secret, $app_id);

$data = array(
    'name' => 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];
}
</code>

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

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

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

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

打开Pusher的控制台:

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

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

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

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

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

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

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

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

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

<code>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;
    }
}
</code>

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

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

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

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

<code>curl_setopt($ch,    CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,    CURLOPT_SSL_VERIFYHOST,false);</code>

这样就可以了

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn