调用Yahoo API监控外汇汇率

参考链接: 
1, http://kuppalli.wordpress.com/2008/11/15/get-live-currency-value-using-yahoo-api/
2, http://www.gummy-stuff.org/Yahoo-data.htm

刚到墨尔本时, 我壮了壮胆子, 在 Subway 吃了一顿, 然后用我招商银行的信用卡结了账. 感觉还不错, 心想至少拿着人民币也饿不着了. 但回家一看账单, 招行先把账单上的澳元换美元, 再换人民币, 最后算给我的汇率就比当时的澳元/人民币汇率高的多了. 还是找个汇率低的时候多换点吧.

Yahoo! 上提供了各种金融数据的接口, 有股票/能源/期货自然也有外汇汇率. 我参考了一下API, 查询澳币/人民币汇率的方法是:

http://download.finance.yahoo.com/d/quotes.csv?e=.csv&f=sl1d1t1&s=AUDCNY=x

上面的链接在浏览器中可以得到如下数据:

“AUDCNY=X”,6.7402,”3/5/2012″,”3:40am”

其实就是CSV格式了, 所以可以看出在URL里的”f=sl1d1t1″就分别指定了代号, 汇率, 日期, 时间这四个字段. 再往下就很简单了. 用 curl 获取数据, 再写入 MySQL 数据库就完成了采集功能. 而对比最近的几次汇率, 如果突破阈值就发送邮件, 也就完成了基本的监控功能了.

下面是我写的 PHP 文件, 用 Cron 设定间隔执行即可, 例如5分钟一次:

*/5  *  *  *  *  /usr/bin/php /home/raymond/path/to/cron-task.php

PHP 源码(写的很原始 ^o^):

<?php
$url = “http://download.finance.yahoo.com/d/quotes.csv?e=.csv&f=sl1d1t1&s=AUDCNY=x+AUDUSD=x”;
$trigger_low = 6.68;
$trigger_high = 6.93;

$dbc = mysql_connect(“localhost”, “root”, “blizzard”);
if(!$dbc):
die(“Error connecting to DB.” . mysql_error());
endif;
?>
<?php
$handle = curl_init($url);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($handle);

if(curl_errno($handle)):
echo “CURL Error: ” . curl_error($handle);
else:
$sql = “insert into `forexrates` (`currencypair`, `rate`, `source-time`) values “;
$values = array();

$rows = explode(“\n”, $result); //echo print_r($rows); echo print_r($result);
foreach($rows as $row):
//”AUDCNY=X”,6.8059,”2/29/2012″,”7:54pm”
$cols = explode(“,”, $row);
if(count($cols) < 4):
continue;
endif;
$currency_pair = substr($cols[0], 1, 6);
$rate = $cols[1];
$t = trim($cols[2], ‘” ‘) . ‘ ‘ . trim(trim($cols[3]), ‘”‘); //echo $t;

$source_date = new DateTime($t);
$source_date_str = $source_date->format(‘Y-m-d H:i:s’);

$values[] = ” (‘$currency_pair’, ‘$rate’, ‘$source_date_str’)”;
endforeach;

mysql_selectdb(‘falcon’, $dbc);
$sql .= implode(‘,’, $values); //echo $sql;
mysql_query($sql, $dbc);
if(mysql_errno($dbc)):
echo mysql_error($dbc);
endif;
endif;
curl_close($handle);
?>
<?php //notification for AUDCNY high and low rates
$sql = “select rate from forexrates where currencypair=’AUDCNY’ order by id desc limit 2″;
$query = mysql_query($sql, $dbc);
$rate1 = (double)mysql_result($query, 0, ‘rate’);
$rate2 = (double)mysql_result($query, 1, ‘rate’); echo $rate2 . ‘ –> ‘ . $rate1;

$subject = ”;
$to = ‘[email protected]’;
$body = (string)$rate1;
if($rate1 > $rate2 && $rate2 > $trigger_high):
$subject = ‘The rate is getting HIGH!’;
mail($to, $subject, $body);
elseif($rate1 < $rate2 && $rate2 < $trigger_low):
$subject = ‘The rate is getting LOW!’;
mail($to, $subject, $body);
endif;

mysql_close($dbc);
?>

Nginx + fastCGI + php5-fpm (Ubuntu 10.04)

参考1: http://wiki.mediatemple.net/w/(ve):Install_PHP-FPM_on_Ubuntu_10.04
参考2: http://wiki.nginx.org/HttpCoreModule#try_files

年前的大事基本都办了, 我又有时间折腾了.  🙂

一直听说用 nginx + fastCGI + php5-fpm 方法跑 PHP 是相当快的. 于是我来试试. 自己的经济舱级别的 VPS 只支持 Ubuntu Server 10.04, php5-fpm 还不在软件源当中. 好在 PPA 源中已经有了.

前提: 如果还不能用 PPA, 先要:

$sudo apt-get install python-software-properties

然后添加 php5-fpm 的 PPA:

$sudo add-apt-repository ppa:brianmercer/php

假设只缺少 php5-fpm, 其它 nginx, php5, mysql 什么的都有了, 那就…

$sudo apt-get install php5-fpm

然后用缺省设置启动 php5-fpm:

$sudo update-rc.d enable php5-fpm
$sudo invoke-rc.d php5-fpm start

下一步是让 nginx 把 php 请求转发给 php5-fpm, 缺省监听端口是9000. 我的 nginx 配置样本(只是从 server 开始):

server{
        listen 80;
        server_name your.domain.name;
	client_max_body_size 2M;

	root   /path/to/your/site;
        expires 14d;
	index	index.html index.htm index.php

        gzip on;
        gzip_comp_level 3;
        gzip_types text/plain text/html text/css image/png application/json application/x-javascript text/xml application/xml+rss;
        gzip_vary on;
        gzip_buffers 16 8k;

        location / {
                try_files $uri $uri/ /index.php?q=$uri&$args;
        }

	location ~ \.php$ {
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_index index.php;
		fastcgi_param APPLICATION_ENV production;
		include /path/to/your/fcgi.conf;

		expires off;
	}
}

下面是 fcgi.conf 样本:

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;

fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;

fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;

# PHP only, required if PHP was built with –enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

比较 /etc/nginx/fastcgi_params, 貌似这个 fcgi.conf 只是增加了 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 一行. 不过我还是喜欢做个完整的 conf 再说 🙂

最后重启 nginx 服务试试吧, 是不是比以前快些呢? 我之前是用 nginx + apache2 + mod_php 的, 改善是明显的.

让Ubuntu Server支持Drupal的文件上传进度条

参考: Installing PECL uploadprogress Extension for Drupal FileField 3.0 Module

不记得从哪个版本, Drupal开始支持文件上传进度条了. 但由于利用的是服务器PHP扩充, 所以单独靠Drupal是无法完成安装的. WordPress开包即支持文件上传进度条, 但依靠的是客户端浏览器的Flash插件.

在Ubuntu Server(Desktop版本也一样)平台下, 按下面几步安装来自pecl.php.net的uploadprogress.so即可:

首先, 如果之前没有安装过pecl的任何扩充, 那么先安装pecl:

$sudo apt-get install php-pear

然后, 使用pecl来安装uploadprogress:

$sudo pecl install uploadprogress

完成之后, 在php.ini配置文件中加载uploadprogress, 并适当提高对上载文件尺码的限制(例如32MB):

extension=uploadprogress.so

upload_max_filesize=32M

post_max_size=64M

重新启动apache2, 让修改生效吧.

另外我用nginx做了个reverse proxy, 那么在nginx的对应配置下, 一般来说在server{ }里面, 加上:

client_max_body_size 64m;

然后应该就可以了.  😛