【问题标题】:How to store unserializable object between http requests in PHP?如何在 PHP 中的 http 请求之间存储不可序列化的对象?
【发布时间】:2012-11-16 14:54:13
【问题描述】:

在我的网络应用程序中,我使用Amazon ECS PHP Class 来获取有关亚马逊产品的数据。目前我为每个页面请求创建新对象。初始化对象大约需要 1000 毫秒,从亚马逊获取数据大约需要 100 毫秒。

我的问题是如何避免为每个用户请求创建对象?我不确定它在 PHP 中是否可行,因此请随意提出替代解决方案。

我想我需要创建一个小程序,它将在服务器上运行并侦听来自 PHP 的请求,从 Amazon 获取数据并将其返回给 PHP。请建议我是否正确并告诉我应该看什么?

【问题讨论】:

  • 创建对象真的需要1秒?!
  • 99% 的时间花在 SoapClient 对象初始化上。
  • @vim:快速扫描源代码,在我看来,通过主动阻止序列化,对象本身并不是不可序列化的。但是,它可能只是需要通过支持 sleepwakeup 方法进行一些小扩展:php.net/language.oop5.magic#object.sleep - 从基类扩展并添加这些以进行一些测试.序列化可能会帮助您缓存对象,使其在您的情况下使用更加灵活。您还可以在 github 上添加功能或拉取请求。

标签: php listener daemon


【解决方案1】:

这里有一些提示可以帮助您顺利上路:

  • 您正在使用的类有意添加 1 秒延迟以避免达到 Amazon 油门限制 (AmazonECS::requestDelay($enable = null))。
  • 您不应序列化 AmazonECS 实例,因为它只是 Amazon ECS API 的一个接口,并不包含您想要的数据。
  • 您应该在用户会话中缓存您在 AmazonECS 实例上执行的请求的结果。

这是一个粗略的示例(我之前没有使用过 AmazonECS,您也没有提供任何代码):

session_start(); // remove this if you are already doing it somewhere else

$amazon = new AmazonECS($accessKey, $secretKey, $country, $associateTag);

$myQuery = 'my query';

if (isset($_SESSION['amazon_ecs_cache'][$myQuery]) {
     // use the cached data in the session
     $myData = $_SESSION['amazon_ecs_cache'][$myQuery];
} else {
     // get the data from amazon
     $myData = $amazon->search($myQuery);
     // cache it so we don't have to get it again next time
     $_SESSION['amazon_ecs_cache'][$myQuery] = $myData;
}

// do fun stuff with $myData here
var_dump($myData);

【讨论】:

  • 1. performSoapRequest() 函数有 1 秒的延迟,但是在我们初始化对象的时候并没有调用这个函数。
【解决方案2】:

如果您要序列化的对象是不可序列化的,只需创建一个可序列化并带有您真正感兴趣的值的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 2017-12-30
    • 2012-07-31
    相关资源
    最近更新 更多