这并不是一个完整的解决方案,这是一个让方法继续的想法。
首先,你要pending_to_publish
操作,而不是处理zip文件,而是将其路径保存在transensient上。此瞬态是所有已批准和未处理的zip文件的数组。
代码可能比文字更能解释:
add_action( \'pending_to_publish\', \'put_zip_in_queue\' );
function put_zip_in_queue( $post ) {
// I put post in draft status, so until zip is processed the post is not visible
$postarr = array(\'ID\' => $post->ID, \'status\' => \'draft\');
wp_insert_post($postarr);
$zip_path = get_the_zip_path( $post ); // this function is up to you ;)
$queue = (array)get_transient(\'zip_queue\');
$queue[] = $zip_path;
set_transient(\'zip_queue\', $queue);
}
在那之后
设置Cron 在第二个EC2实例中,通过sokets调用第一个实例上的脚本,该脚本检查“queue\\u on\\u hold”瞬态,如果为空,则检查“zip\\u queue”瞬态,如果不为空,则获取队列中的第一条路径,并通过套接字将其传递给第二个EC2实例。套接字发送成功后,相同的脚本会保存暂时的“queue\\u on\\u hold”,因此如果再次调用第二个实例,则不会执行任何操作:
function respond_to_cron_call() {
// allow comunication only from the second ec2 instance checkin its IP
if ( $_SERVER[\'REMOTE_ADDR\'] != 169.254.169.253) return;
// server must also pass a key as second security layer
if ( ! isset($_POST[\'key\']) || hash(\'sha256\', $_POST[\'key\']) != $mystoredkey) return;
if ( get_transient(\'queue_on_hold\') ) return;
$queue = (array)get_transient(\'zip_queue\');
if ( $queue[0] ) {
// function up to you
$send = send_socket_to_second_ec2_instance( $queue[0] );
if ( $send ) {
set_transient(\'queue_on_hold\', $queue);
}
}
}
第二个EC2实例接收带有路径的套接字并对其进行处理。完成后,将状态为“正在处理”的套接字发送回第一个实例:
function my_super_awesome_zip_process_on_ec2_instance() {
// allow comunication only from the first ec2 instance checkin its IP
if ( $_SERVER[\'REMOTE_ADDR\'] != 169.254.169.254) return;
// server must also pass a key as second security layer
if ( ! isset($_POST[\'key\']) || hash(\'sha256\', $_POST[\'key\']) != $mystoredkey) return;
..
...
send_socket_to_first_ec2_instance(); // function up to you
}
第一个实例收到状态,如果确定,更新“zip\\u队列”,删除刚刚处理的文件;将相关帖子设置为已发布(因为仍在起草中);删除临时“queue\\u on\\u hold”
function respond_to_status( $status ) {
// allow comunication only from the second ec2 instance checkin its IP
if ( $_SERVER[\'REMOTE_ADDR\'] != 169.254.169.253) return;
// server must also pass a key as secon security layer
if ( ! isset($_POST[\'key\']) || hash(\'sha256\', $_POST[\'key\']) != $mystoredkey) return;
if ( $status != \'complete\' ) return;
delete_transient(\'queue_on_hold\')
$queue = (array) get_transient(\'zip_queue\');
$postid = get_post_from_zip_path(queue[0]); // up to you
unset(queue[0]);
set_transient(\'zip_queue\', $queue);
$postarr = array(\'ID\' => $postid, \'status\' => \'publish\');
wp_insert_post($postarr);
}
现在zip已处理,帖子已发布,一切正常。:)在下一次Cron运行时,该进程将再次启动。
Cron的运行频率由您决定,很大程度上取决于zip进程所需的时间,如果需要,还可以设置不同的频率:例如,每5分钟夜间,每15分钟白天。。。
希望有帮助。