PHP include Page.php, if Page=404 { PHP include API { WRITE API as Page.php (存储 APIs服务器)

PHP include Page.php, if Page=404 { PHP include API { WRITE API as Page.php (Storing APIs on Servers)

我正在 scraping 来自 API 的数据。问题是我为每个页面加载查询数据的频率太高,所以我想在第一次查询后 将数据存储在服务器 上。根据服务条款,这应该没问题。

举例。com/page:

<?php include 'example.com/data'; ?>

举例。com/data:

<?php include 'api.com/include'; ?>

所以我包含了来自我的服务器的一个页面,该页面包含了来自外部服务器的 api 数据。

问题 1:如何告诉 example.com/data 将 api.com/include 中的信息写入或保存为服务器上的文件,例如例如。com/data1.php ?

问题 2:如何区分 example.com/page 到 php include example.com/data1.php,如果是 404 (不存在)来包含示例。com/data 而不是?

问题 1 和 2 都得到回答后,我可以查询 api 一次,将数据存储为文件,如果该文件存在,则使用该页面中的数据,而不必查询 api 每次加载页面时。

如果您知道更好的方法,我将不胜感激。尽管我从 example.com/data 中包含 example.com/page 而不是直接从 api.com/include 中包含很重要,因为 example.com/data 具有正确的代码正确解释和过滤来自 api/include.

的信息的处理程序

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

谢谢!

您应该使用 class 来解除这种行为。像这样:

<?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();

尚未测试此代码,因此您将不得不 fiddle 稍微测试一下。添加命名空间、路径等。