存储持久PHP对象的理想位置

时间:2014-02-12 作者:P_Enrique

我正在编写一些后台批处理的插件,即需要30秒以上时间的操作。我正在使用如下设置的必要作业参数创建对象(这是一个非常简化的示例):

class MyPlugin_Create_Terms {
    public $job_id;
    public $terms;
    public $taxonomy;
    public $created = 0;
    public function init( $terms, $taxonommy ) {
         $this->job_id = uniqid();
         $this->terms = $terms;
         $this->taxonomy = $taxonomy;
         return $this->job_id;
    }
    public function do_job( $object_storage ) {
         foreach( $this->terms as $term ) {
             wp_insert_term( $term, $this->taxonomy );
             $this->created++;
             $object_storage->save_object( $this->job_id, $this );
         }
    }
}

$create_terms = new MyPlugin_Create_Terms();
$job_id = $create_terms->init( $_POST[\'user_input_terms\'], $_POST[\'user_input_taxonomy\'] );
$object_storage = new MyPlugin_Object_Storage();
$object_storage->save_object( $job_id, $create_terms );
在另一个过程中:

$object_storage = new MyPlugin_Object_Storage();
$create_terms = $object_storage->load_object( $job_id );
$create_terms->do_job( $object_storage );
在其他任何地方:

$object_storage = new MyPlugin_Object_Storage();
$create_terms = $object_storage->load_object( $job_id );
echo "We have created {$create_terms->created} terms.";
现在的问题是实现Object_Storage. 我已经找到了以下存储对象的选项:

瞬态。他们显然不会这样做,因为他们没有保证的生命周期(我知道,有了缓存,瞬态可能永远不会写入数据库)。

现有DB表。序列化的PHP对象不应保存到MySQLtext 字段,因为它们可能包含NULL 字节((我在用protected usermeta表的属性):

请注意,这是一个二进制字符串,可能包含空字节,因此需要进行存储和处理。例如,serialize()输出通常应存储在数据库的BLOB字段中,而不是CHAR或TEXT字段中。- PHP Manual: serialize()

创建自定义表格BLOB 键入用于序列化任何对象的字段,或者在不序列化的情况下存储对象数据。感觉有点过头了。最佳做法是什么?

使用文件系统。锁定、原子和非原子进程以及文件权限等各种因素使这一问题变得复杂。具体来说,由于将有两个进程同时访问该对象,因此当它们需要查看同一对象时,竞争条件存在问题。

使用会话?可能不适合两个并发进程。

如果您有任何想法,我们将不胜感激!

2 个回复
最合适的回答,由SO网友:fuxia 整理而成

将对象临时存储在数据库中,但实现__sleep() and __wakeup() 避免副作用。

或者,实施Serializable interface 并在其方法中准备数据。不需要存储空值。

SO网友:Otto

从长远来看,您应该考虑,如果您有一个进程经常会超过最大执行时间,那么从HTTP请求和轮询内部运行它并不是一个好主意。考虑改用真正的cron系统。命令行PHP进程通常没有最长执行时间,可以一直运行到完成。

短期而言,如果您想将其安全地存储在文本字段中,如自定义post类型或meta或其他内容中,请将其序列化,然后对字符串进行base64\\u编码。这将解决空字节的问题。只要在需要再次检索时对其进行解码并取消序列化即可。

结束

相关推荐

Pagination on Custom Loop

我想将最新帖子的样式与自定义页面上某个类别中的所有其他帖子的样式不同。到目前为止,我有下面的代码,它正是这样做的:<?php if (have_posts()) : ?> <?php query_posts(\"cat=4&showposts=1\"); ?> <?php while (have_posts()) : the_post(); ?> (Style1)<?php the_title(); ?><