Php 如何使用yahoo finance获取实时股价

Php 如何使用yahoo finance获取实时股价,php,jquery,ajax,yahoo-finance,Php,Jquery,Ajax,Yahoo Finance,我有以下几个要求 无需页面刷新或ajax即可获取实时股价。(例如,雅虎财经,他们在没有页面刷新和ajax调用的情况下获得最新股价) 从BSE、NSC等股票市场获取股票价格 现在使用下面的代码,我可以得到股票价格,但我必须刷新页面或调用ajax,这两种情况都需要20到30秒,但在许多金融网站上,他们可以在不使用ajax的情况下每秒更新价格 <?php /** * Class to fetch stock data from Yahoo! Finance * */ class

我有以下几个要求

  • 无需页面刷新或ajax即可获取实时股价。(例如,雅虎财经,他们在没有页面刷新和ajax调用的情况下获得最新股价)
  • 从BSE、NSC等股票市场获取股票价格
  • 现在使用下面的代码,我可以得到股票价格,但我必须刷新页面或调用ajax,这两种情况都需要20到30秒,但在许多金融网站上,他们可以在不使用ajax的情况下每秒更新价格

    <?php
    /**
     * Class to fetch stock data from Yahoo! Finance
     *
     */
    
        class YahooStock {
    
            /**
             * Array of stock code
             */
            private $stocks = array();
    
            /**
             * Parameters string to be fetched  
             */
            private $format;
    
            /**
             * Populate stock array with stock code
             *
             * @param string $stock Stock code of company   
             * @return void
             */
            public function addStock($stock)
            {
                $this->stocks[] = $stock;
            }
    
            /**
             * Populate parameters/format to be fetched
             *
             * @param string $param Parameters/Format to be fetched
             * @return void
             */
            public function addFormat($format)
            {
                $this->format = $format;
            }
    
            /**
             * Get Stock Data
             *
             * @return array
             */
            public function getQuotes()
            {       
                $result = array();     
                $format = $this->format;
    
                foreach ($this->stocks as $stock)
                {           
                    /**
                     * fetch data from Yahoo!
                     * s = stock code
                     * f = format
                     * e = filetype
                     */
                    $s = file_get_contents("http://finance.yahoo.com/d/quotes.csv?s=$stock&f=$format&e=.csv");
    
                    /**
                     * convert the comma separated data into array
                     */
                    $data = explode( ',', $s);
    
                    /**
                     * populate result array with stock code as key
                     */
                    $result[$stock] = $data;
                }
                return $result;
            }
        }
        $objYahooStock = new YahooStock;
    
        /**
            Add format/parameters to be fetched
    
            s = Symbol
            n = Name
            l1 = Last Trade (Price Only)
            d1 = Last Trade Date
            t1 = Last Trade Time
            c = Change and Percent Change
            v = Volume
         */
        $objYahooStock->addFormat("snl1d1t1cv");
    
        /**
            Add company stock code to be fetched
    
            msft = Microsoft
            amzn = Amazon
            yhoo = Yahoo
            goog = Google
            aapl = Apple   
         */
        $objYahooStock->addStock("msft");
        $objYahooStock->addStock("amzn");
        $objYahooStock->addStock("yhoo");
        $objYahooStock->addStock("goog");
        $objYahooStock->addStock("vgz");
        $objYahooStock->addStock("FB");
        /**
         * Printing out the data
         */
        ?>
        <table width="100%">
        <tr>
            <th>Row</th>
            <th>Code</th>
            <th>Name</th>
            <th>Last Trade Price</th>
            <th>Last Trade Time</th>
            <th>Change and Percent Change</th>
            <th>Volume</th>
        </tr>
        <?php
        foreach( $objYahooStock->getQuotes() as $code => $stock)
        {
            ?>
            <tr>
                <td><?php //print_r($stock); ?></td>
                <td><?php echo $stock[0]; ?></td>
                <td><?php echo $stock[1]; ?></td>
                <td><?php echo $stock[2]; ?></td>
                <td><?php echo $stock[3]; ?></td>
                <td><?php echo $stock[4]; ?></td>
                <td><?php echo $stock[5]; ?></td>
                <td><?php echo $stock[6]; ?></td>
            </tr>
    
            <?php
        }
    ?>
        </table>
    
    
    一行
    代码
    名称
    最后交易价格
    最后交易时间
    变化和百分比变化
    卷
    
    在您的方法中,股票价格获取是由客户端(用户的浏览器)触发的。因此,除了页面刷新或AJAX之外,无法触发它

    但是,您的服务器可以获取这些数据,而不考虑用户。比如:

    data source <----> your backend server fetching the data ---> your database <---- your frontend web server <---> users
    

    数据源您的后端服务器获取数据--->您的数据库检查此web这可能是您想要的(将其用于实时web应用程序)

    教程


    就谷歌而言,我很确定API已经过时,不再工作了。你可能可以使用雅虎财经api,他们有用于csv下载和通过yql的api

    参考:

    就实时性而言,我建议看看雅虎的网络服务。以下是一个例子: 如果不提供格式,它将返回XML

    如何在不刷新或Ajax的情况下实现实时性


    你可以创建一个pubsub模型,让你的应用程序订阅你的应用程序,你必须创建这个层,因为YahooAPI是基于拉的而不是基于推的。因此,您需要从雅虎获取股票报价,并将其推送到您的应用程序中。您可能可以使用JMS for java或sockets,以适合您的为准。

    据我所知,在不刷新页面或AJAX的情况下,您可以使用它的演示从服务器获取数据,这就是它看起来像这样的原因。我也可以使用ajax中的代码,但我不想也使用ajax(您可以在我的需求中看到这一点)。
    <?php
    
    class U_Yahoo{
    
        private function file_get_contents_curl($url) {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_HEADER, 0);
    
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    
            curl_setopt($ch, CURLOPT_URL, $url);
    
            $data = curl_exec($ch);
            curl_close($ch);
    
            return $data;
        }
    
        //return the history quote from the simbol, default begin date is 90 day ago, the default end is today
        public function getHistoryQuote($symbol, $begin = 90, $end = 0){
            if(!$begin && !$end)
                $begin = $end = 0;
    
            $begin = Date('Y-m-d', strtotime("-{$begin} days"));
            $end = Date('Y-m-d', strtotime("-{$end} days"));
            $url = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.historicaldata%20where%20symbol%20%3D%20%22$symbol%22%20and%20startDate%20%3D%20%22$begin%22%20and%20endDate%20%3D%20%22$end%22&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=";
            $jason_obj = json_decode( $this->file_get_contents_curl($url) );
            return $jason_obj->query->results->quote;
        }
    
        //return not just the quote but others informations too
        public function getCurrentData($symbol){
            $is_array = is_array($symbol);
    
            $imp_symbol = ($is_array)? implode('%22%2C%22', $symbol) : $symbol;
    
            $url = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quote%20where%20symbol%20in%20(%22$imp_symbol%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=";
            $jason_obj = json_decode( $this->file_get_contents_curl($url) );
    
            $result = $jason_obj->query->results->quote;
    
            return (is_array($symbol) and (count($symbol) == 1))? [$result] : $result;
        }
    
        //return all quotes from the param $symbol passed, if symbol is array, it will return other array indexed by the symbols
        public function getCurrentQuote($symbol){
            if(is_array($symbol)){
                $symbol = empty($symbol)? ['GOOG'] : $symbol;
                $data = $this->getCurrentData($symbol);
                $result = [];
    
                for ($c = 0; $c < count($data); $c++) { 
                    $result[$data[$c]->Symbol] = $data[$c]->LastTradePriceOnly;
                }
    
                return $result;
            }else
                return $this->getCurrentData($symbol)->LastTradePriceOnly;
        }
    
    }
    
    $yahoo = new U_Yahoo();
    var_dump( $yahoo->getCurrentQuote('GOOG') );
    var_dump( $yahoo->getCurrentQuote(['GOOG', 'YHOO']) );
    
    var_dump( $yahoo->getCurrentData(['GOOG', 'YHOO']) );
    
    var_dump( $yahoo->getHistoryQuote('YHOO', 20, 0) );