我收到了一个JSON数据,它从URL返回最后一个比特币的股票代码。数据(自动收报机)在60秒内更新。如何将所有代码动态保存到数据库中?我想创建比特币代码的历史。
请遵循以下代码。
<?php
// init curl object
$ch = curl_init();
// define options
$optArray = array(
CURLOPT_URL => 'https://www.mercadobitcoin.net/api/v2/ticker/',
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_TIMEOUT => 60
);
// apply those options
curl_setopt_array($ch, $optArray);
// execute request and get response
$response = curl_exec($ch);
$phpArray = json_decode ($response);
?>
答案 0 :(得分:1)
首先,您不应该将JSON数据存储在数据库中(或将其他序列化数据存储为数据库中的列)。那是SQL代码最高阶的气味。相反,解码JSON并存储实际值。
这里有一张桌子给你:
CREATE TABLE `so`.`ticker_history` (
`ticker_history_id` INT NOT NULL AUTO_INCREMENT,
`ticker_history_high` DECIMAL(10,10) NULL,
`ticker_history_low` DECIMAL(10,10) NULL,
`ticker_history_vol` DOUBLE NULL,
`ticker_history_last` DECIMAL(10,10) NULL,
`ticker_history_buy` DECIMAL(10,10) NULL,
`ticker_history_sell` DECIMAL(10,10) NULL,
`ticker_history_date` DATETIME NULL,
PRIMARY KEY (`ticker_history_id`));
现在,这里有一些更新的(未经测试的)代码:
<?php
// init curl object
$ch = curl_init();
// define options
$optArray = array(
CURLOPT_URL => 'https://www.mercadobitcoin.net/api/v2/ticker/',
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_TIMEOUT => 60
);
// apply those options
curl_setopt_array($ch, $optArray);
// execute request and get response
$response = curl_exec($ch);
$phpArray = json_decode ($response);
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
$sql = "INSERT INTO `so`.`ticker_history`
( `ticker_history_high`
, `ticker_history_low`
, `ticker_history_vol`
, `ticker_history_last`
, `ticker_history_buy`
, `ticker_history_sell`
, `ticker_history_date`
)
VALUES
( :ticker_history_high
, :ticker_history_low
, :ticker_history_vol
, :ticker_history_last
, :ticker_history_buy
, :ticker_history_sell
, :ticker_history_date
)";
$date = new DateTime(strtotime("@" . $phpArray->date ));
$values = [ 'ticker_history_high' = $phpArray->high
, 'ticker_history_low' = $phpArray->low
, 'ticker_history_vol' = $phpArray->vol
, 'ticker_history_last' = $phpArray->last
, 'ticker_history_buy' = $phpArray->buy
, 'ticker_history_sell' = $phpArray->sell
, 'ticker_history_date' = $date->format("Y-m-d H:i:s")
];
$stmt = $dbh->prepare($sql);
$result = $stmt->execute($values);
if($result === false) die($stmt->errorInfo()[2] . " @ " . __FILE__ . ":" . __LINE__);
注意我使用十进制10,10作为数据类型。您应该查找最大有效位数并进行相应调整。
不断检查
PHP不是像这样做实时源的最佳选择。它的多线程模型不如Python。而且,如果在Apache中运行,它会启动一个线程,工作并结束请求。但是 - 并不是说它无法完成:为了不断轮询,您需要从命令行启动它,并构建一个以给定间隔轮询相关URL的循环。一个简单的while()循环执行你的curl语句并查找更改就足够了。检测到更改时(当前返回json!== last return json),然后将新值存储在数据库中。
您还需要担心重击服务器并让自己被禁止。经常检查,你可能会被防火墙挡住。
另外......通常......如果您正在处理实时订阅源,您将能够打开套接字并接收从主机发送的数据。你可以用PHP做到这一点,但是,与其他语言相比,它很笨拙。这仅仅是一个FYI ...因为您的上述用例特定于从您的问题中的URL请求JSON值。