如何使用PHP保存最后一小时的数据

时间:2015-11-10 05:59:20

标签: php

只保存最后一小时信息的优雅方式是什么?在我的情况下,我正在记录信息,例如:

Tue Nov 10 05:17:12 UTC 2015   \t   apple
Tue Nov 10 05:42:27 UTC 2015   \t   banana
Tue Nov 10 05:51:41 UTC 2015   \t   carrot

我只需要过去一小时的信息。我希望以简单和防弹的方式保存到一个或多个文本文件。即,没有遍历目录以基于广泛模式匹配来删除旧文件。如果我有2小时的数据,这不是问题,但我不想要不到1小时。

我有想法替换2或3个文件,有时记录到> 1文件,并在特定时间删除一个或其他特定文件,但我无法弄清楚逻辑。

假设PHP。因此,这是来自Web请求的按需,而不是crontab。

3 个答案:

答案 0 :(得分:0)

我刚才处理过类似的问题。我的解决方案是使用两个文件,保存到最后两个小时。在伪代码中:

 # two files
 file0 = a file
 file1 = another file

 # delete old files
 if file0 older than 2 hours, delete file0
 if file1 older than 2 hours, delete file1

 # select newest file, and delete on alternating hours
 if current hour mod 2 = 0 then
     newest file = file0; 
     delete file1;
 else
     newest file = file1;
     delete file0;

 # save data to end of file
 print data to file0; 
 print data to file1;

 # the file to use is: newest file

这与您想要的有点不同,因为它长达2小时,但如果主要想法是您总是想要最后一小时,那么此方法将起作用。

这是一个细分。 F0 = file0; F1 = file1; a,b,c =数据

 time    mod   data   clear   F0      F1      fileToUse
 23:45   1     a      F0      a       a       F1
 00:15   0     b      F1      ab      b       F0
 00:45   0     c      F1      abc     c       F0
 10:05   0     d      F0,F1   d       d       F0
 11:30   1     e      F0      e       de      F1

答案 1 :(得分:0)

对@michaelCodes回答,但使用了三个文件。这可以保证data_file中有一整小时的数据。它一次只能记录两个文件。

public async static void Login()
    {
        try
        {
            var scopes = new[] {
              "onedrive.readwrite",
              "onedrive.appfolder",
              "wl.signin"
        };

            _client = Microsoft.OneDrive.Sdk.OneDriveClient.GetMicrosoftAccountClient("d5f4ce5f-116a-4b77-a5a7-bd81802cdc7e","urn:ietf:wg:oauth:2.0:oob", scopes, null, null, null);
            OnedriveClient._client = _client;
            var session = await _client.AuthenticateAsync();
           // AppSettings.SkyDriveLogin = true;

            var AccessToken = _client.AuthenticationProvider.CurrentAccountSession.AccessToken;
            //REST API to request info about the signed-in user
            var uri = new Uri($"https://apis.live.net/v5.0/me?access_token={AccessToken}");

答案 2 :(得分:0)

换句话说,日志中的任何记录仅在创建后的60分钟内有效。您可以使用内存存储系统,如memcached / redis。此类系统具有垃圾收集功能,您可以将它们设置为每小时对磁盘执行快照,或者您可以查询有效密钥。