6

一位客户希望我使用 PHP 内置的自定义解决方案将他们的 Twitter 流添加到他们的网站主页。

Twitter API 显然每小时可以调用的次数有限,因此我无法在每次有人刷新我客户的主页时自动 ping Twitter。

客户的网站目前纯 HTML,因此没有可用的数据库。因此,我的解决方案必须只需要 PHP 和本地文件系统(例如,保存一个包含一些数据的本地 XML 文件)。

那么,鉴于这个有限的标准,对我来说,通过 PHP 访问 Twitter API 而不在几分钟内达到我的 API 调用限制的最佳方式是什么?

4

6 回答 6

3

一旦您可以拉下时间线并显示它,然后添加一些基于文件的缓存,这将非常容易。

check age of cache
Is it more than 5 mins old?
    fetch the latest information
    regenerate the HTML for output
    save the finished HTML to disk
display the cached pre-prepared HTML

PEAR 的 Cache_Lite将在缓存层上满足您的所有需求。

于 2009-06-04T12:45:51.550 回答
0
  1. 一个 cron 作业(不是 likley - 如果甚至没有数据库,那么就没有 cron 作业)
  2. 写入microtime()文件。在页面视图上将当前时间戳与保存的时间戳进行比较。它的差异大于 N 分钟,拉新的 tweetfeed 并将当前时间戳写入文件
  3. 如果首页是一个不调用任何 php 的静态 html 文件,请包含一个<img src="scheduler.php"/>返回 1px 透明 gif 的图像(至少在我年轻的时候你是这样做的),并默默地拉你的 twitter

还是您的意思是本地-本地文件系统,例如“我/客户的计算机而不是服务器”-本地?

在这种情况下:

  1. 使用 cron 作业或调度程序和 PHP 获取一些服务器
  2. 编写一个脚本来读取提要并将其保存到文件中
  3. 使用 FTP 将文件写入客户服务器
  4. 使用 javascript 显示提要(是的,ajax 也可以使用静态文件作为数据源)。jquery 或一些 lib 非常适合这个
  5. 或:在本地创建显示推文的 html 文件并上传(但要小心……因为您可能会覆盖服务器上的更新)

imo:对于小型站点,您通常并不需要完全成熟的 sql 数据库。文件系统很棒。scandirpreg_match和精心挑选的文件名的组合通常就足够了。
而且您实际上可以使用漂亮的 javascript 进行大量前端处理(例如显示 XML)。

于 2009-06-04T11:45:38.707 回答
0

由于我们不知道您的服务器配置,我建议您设置一个 cron 作业(假设您在 Linux 机器上)。如果您在共享主机环境中有类似 cPanel 的东西,那应该不是什么大问题。您需要编写一个由 cron 调用的脚本,它将获取最新的推文并将它们写入文件(xml?)。您可以安排 cron 每 30 分钟运行一次。或者你想要什么。

于 2009-06-04T11:55:13.493 回答
0

您可能想使用 Tim Davies 的 TweetPHP。http://lab.lostpixel.net/classes/twitter/ - 这个类有很多功能,包括你想要的,显示你的客户时间线。该页面显示了如何使用它的好例子。

然后,您可以将其输出放入文件或数据库中。如果您希望站点访问者每 5 分钟更新一次数据库或文件,您可以设置一个保存时间戳的会话变量,如果时间戳至少在 5 分钟前,则允许再次更新。

希望这可以帮助

于 2009-06-04T12:36:24.627 回答
0

我的建议:创建一个简单的小对象来保存缓存日期和一系列推文。每次有人访问该页面时,它都会执行以下逻辑:

A)文件是否存在?

是:将其读入变量 否:继续步骤 D)

B) 反序列化变量(PHP 对 serialize()/unserialize() 就可以了)

C)将存储的缓存的年龄与当前时间进行比较(Unix时间戳会做到这一点)彼此相距超过5分钟:

D) 从 Twitter 获取最新的推文,更新对象,将其序列化并再次写入缓存。存储最新的推文以供打印。它不是:只需从缓存中读取推文。

E) 打印推文

序列化对象的最简单和最简单的方法是 serialize()/unserialize() 对。如果您不愿意推迟制作对象的努力,您可以使用 2D 数组,serialize() 就可以了。看看http://php.net/serialize

考虑到您没有 cPanel 访问权限,这是最好的解决方案,因为您无法访问 PEAR 包、cron 或任何其他更简单的解决方案。

于 2009-06-04T15:05:38.990 回答
0
array(
'lastrequest' => 123,
'tweets' => array ()
)

现在在您的代码中检查 lastrequest 的数据存储中的时间戳是否超过 X 秒。如果是时候更新您的数据了。

序列化并将数组存储在文件中,非常简单

于 2009-06-04T15:25:20.323 回答