如何从javaScript“停止”PHP页面 - 意味着模仿关闭浏览器窗口

时间:2015-06-07 04:30:29

标签: javascript php twitter

PHP和javaScript的新手。

我提出了一些通过流API来挖掘推文的代码。

实际上我正在调整Mike Pultz制作的this代码(粘贴在下面)。 (谢谢!)

工作正常。它包含两个PHP代码。

- 一个实际挖掘的类。它处理oAuth,打开连接,收听推文,并在页面上吐出它们(最后一部分到现在......作为测试)。它有一个while(1)无限循环。

- 另一个构造前者的实例,并调用启动所有内容的函数,将oAuth秘密作为参数传递。

到目前为止,我一直在从浏览器中调用它(第二个脚本)。当我关闭窗口(或在浏览器中点击停止加载按钮)时,关闭与twitter的连接(循环停止)。非常好。虽然我不知道为什么会发生这种情况,但是一旦循环在另一个脚本中......我假设实例在页面关闭时被销毁,是这样吗?

好的,现在我继续开始编写一些js来构建一个接口来实现这一切。我将有一个函数调用php启动脚本,传递要搜索的参数。我想要一个函数来停止流。

问题: 我怎样才能在PHP中实现这一点?我想在重新创建矿工对象并且不要调用启动器功能......但这并不是一个非常好的方法。

调用代码:

<?php
require 'ctwitter_stream2.php';

$t = new ctwitter_stream2();

$t->login($_cKey,
 $_cSecret, 
 $_aToken,
 $_aSecret);

$t->start(array('query'));
?>

采矿课(已经从原文调整过):

<?php

class ctwitter_stream2
{
    private $m_oauth_consumer_key;
    private $m_oauth_consumer_secret;
    private $m_oauth_token;
    private $m_oauth_token_secret;

    private $m_oauth_nonce;
    private $m_oauth_signature;
    private $m_oauth_signature_method = 'HMAC-SHA1';
    private $m_oauth_timestamp;
    private $m_oauth_version = '1.0';

    public function __construct()
    {
        //
        // set a time limit to unlimited
        //
        set_time_limit(0);
    }

    //
    // set the login details
    //
    public function login($_consumer_key, $_consumer_secret, $_token, $_token_secret)
    {
        $this->m_oauth_consumer_key     = $_consumer_key;
        $this->m_oauth_consumer_secret  = $_consumer_secret;
        $this->m_oauth_token            = $_token;
        $this->m_oauth_token_secret     = $_token_secret;

        //
        // generate a nonce; we're just using a random md5() hash here.
        //
        $this->m_oauth_nonce = md5(mt_rand());

        return true;
    }

    //
    // process a tweet object from the stream
    //
    private function process_tweet( $_data)
    {
        print_r($_data);

        return true;
    }

    //
    // the main stream manager
    //
    public function start(array $_keywords)
    {
        while(1)
        {
            $fp = fsockopen("ssl://stream.twitter.com", 443, $errno, $errstr, 30);
            if (!$fp)
            {
                echo "ERROR: Twitter Stream Error: failed to open socket";
            } else
            {
                //
                // build the data and store it so we can get a length
                //
                $data = 'track=' . rawurlencode(implode($_keywords, ','));

                //
                // store the current timestamp
                //
                $this->m_oauth_timestamp = time();

                //
                // generate the base string based on all the data
                //
                $base_string = 'POST&' . 
                    rawurlencode('https://stream.twitter.com/1.1/statuses/filter.json') . '&' .
                    rawurlencode('oauth_consumer_key=' . $this->m_oauth_consumer_key . '&' .
                        'oauth_nonce=' . $this->m_oauth_nonce . '&' .
                        'oauth_signature_method=' . $this->m_oauth_signature_method . '&' . 
                        'oauth_timestamp=' . $this->m_oauth_timestamp . '&' .
                        'oauth_token=' . $this->m_oauth_token . '&' .
                        'oauth_version=' . $this->m_oauth_version . '&' .
                        $data);

                //
                // generate the secret key to use to hash
                //
                $secret = rawurlencode($this->m_oauth_consumer_secret) . '&' . 
                    rawurlencode($this->m_oauth_token_secret);

                //
                // generate the signature using HMAC-SHA1
                //
                // hash_hmac() requires PHP >= 5.1.2 or PECL hash >= 1.1
                //
                $raw_hash = hash_hmac('sha1', $base_string, $secret, true);

                //
                // base64 then urlencode the raw hash
                //
                $this->m_oauth_signature = rawurlencode(base64_encode($raw_hash));

                //
                // build the OAuth Authorization header
                //
                $oauth = 'OAuth oauth_consumer_key="' . $this->m_oauth_consumer_key . '", ' .
                        'oauth_nonce="' . $this->m_oauth_nonce . '", ' .
                        'oauth_signature="' . $this->m_oauth_signature . '", ' .
                        'oauth_signature_method="' . $this->m_oauth_signature_method . '", ' .
                        'oauth_timestamp="' . $this->m_oauth_timestamp . '", ' .
                        'oauth_token="' . $this->m_oauth_token . '", ' .
                        'oauth_version="' . $this->m_oauth_version . '"';

                //
                // build the request
                //
                $request  = "POST /1.1/statuses/filter.json HTTP/1.1\r\n";
                $request .= "Host: stream.twitter.com\r\n";
                $request .= "Authorization: " . $oauth . "\r\n";
                $request .= "Content-Length: " . strlen($data) . "\r\n";
                $request .= "Content-Type: application/x-www-form-urlencoded\r\n\r\n";
                $request .= $data;

                //
                // write the request
                //
                fwrite($fp, $request);

                //
                // set it to non-blocking
                //
                stream_set_blocking($fp, 0);

                while(!feof($fp))
                {
                    $read   = array($fp);
                    $write  = null;
                    $except = null;

                    //
                    // select, waiting up to 10 minutes for a tweet; if we don't get one, then
                    // then reconnect, because it's possible something went wrong.
                    //
                    $res = stream_select($read, $write, $except, 600, 0);
                    if ( ($res == false) || ($res == 0) )
                    {
                        break;
                    }

                    //
                    // read the JSON object from the socket
                    //
                    $json = fgets($fp);

                    //
                    // look for a HTTP response code
                    //
                    if (strncmp($json, 'HTTP/1.1', 8) == 0)
                    {
                        $json = trim($json);
                        if ($json != 'HTTP/1.1 200 OK')
                        {
                            echo 'ERROR: ' . $json . "\n";
                            return false;
                        }
                    }

                    //
                    // if there is some data, then process it
                    //
                    if ( ($json !== false) && (strlen($json) > 0) )
                    {
                        //
                        // decode the socket to a PHP array
                        //

                            //
                            // process it
                            //
                            $this->process_tweet($json);


                    }
                }
            }

            fclose($fp); 
            sleep(10);

        }

        return;
    }
};
?>

1 个答案:

答案 0 :(得分:1)

假设你想从Javascript停止php代码,我想为你提出一个解决方案。

让我们假设您已经启动了脚本,并且稍后您希望停止脚本

1)你可以通过AJAX ping一个php页面,并传递一个参数,将设置保存到文件中。

2)在正在进行流挖掘的php代码中,你可以在文件中存在一个值

假设AJAX ping成功保存了值,while循环将拦截它并执行一个中断将成功退出循环,从而停止它

希望它有所帮助!