我从API中抓取数据。问题是我经常为每个页面加载查询数据,所以我想在第一次查询后在服务器上存储数据。根据服务条款,这应该没问题。
在example.com/page上:
<?php include 'example.com/data'; ?>
在example.com/data上:
<?php include 'api.com/include'; ?>
所以我在服务器中包含一个页面,该页面包含来自外部服务器的api数据。
问题1:如何将example.com/data告知写入或将api.com/include中的信息保存为服务器上的文件,例如example.com/data1.php?
问题2:我如何告诉example.com/page到php包括example.com/data1.php,如果它是404(不存在)而不是包含example.com/data?< /强>
问题1和2都得到了回答我可以查询api一次,将数据存储为文件,如果该文件存在则使用该页面中的数据,而不是每次加载页面时都要查询api。 / p>
如果您知道更好的方法,我会很感激学习它。虽然重要的是我从example.com/page中包含example.com/data而不是直接来自api.com/include,因为example.com/data有正确的代码处理程序来正确解释和过滤来自api / include的信息
如果你能回答这两个问题中的任何一个问题,那么解决其他问题将是一个很好的起点。
谢谢!
答案 0 :(得分:1)
您应该使用类来解除此行为。像这样:
<?php
class ReadApiFromDomainDotCom
{
const TTL = 3600; // File is fresh for 3600 sec
const FILE_NAME = 'whatever.txt';
const API_ADDRESS = "http://api.whatever.com";
/**
* @return string
*/
public function get()
{
if ($this->isCacheValid()) {
return file_get_contents(self::FILE_NAME);
}
return $this->readApi();
}
/**
* @return bool
*/
private function isCacheValid()
{
if (!file_exists(self::FILE_NAME)) {
return false;
}
if ($this->isExpired()) {
return false;
}
return true;
}
/**
* @return bool
*/
private function isExpired()
{
return time() - filemtime(self::FILE_NAME) > self::TTL;
}
/**
* @return string
*/
private function readApi()
{
$data = file_get_contents(self::API_ADDRESS);
file_put_contents(self::FILE_NAME, $data);
return $data;
}
}
然后它将很容易:
$apiReader = new ReadApiFromDomainDotCom();
$data $apiReader->get();
尚未测试此代码,因此您必须稍微调整一下。添加命名空间,路径等。