PHP包括Page.php,如果Page = 404 {PHP包括API {WRITE API as Page.php(在服务器上存储API)

时间:2015-06-10 10:44:50

标签: php api caching include http-status-code-404

从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的信息

如果你能回答这两个问题中的任何一个问题,那么解决其他问题将是一个很好的起点。

谢谢!

1 个答案:

答案 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();

尚未测试此代码,因此您必须稍微调整一下。添加命名空间,路径等。