我正在编写一些后台批处理的插件,即需要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
键入用于序列化任何对象的字段,或者在不序列化的情况下存储对象数据。感觉有点过头了。最佳做法是什么?
使用文件系统。锁定、原子和非原子进程以及文件权限等各种因素使这一问题变得复杂。具体来说,由于将有两个进程同时访问该对象,因此当它们需要查看同一对象时,竞争条件存在问题。
使用会话?可能不适合两个并发进程。
如果您有任何想法,我们将不胜感激!