最後に、私はそれをそのように解決しました:
1位。URL 呼び出しが可能なように操作を設計します。例えば:http://localhost/render-image/14523665
2番目。保留中の操作を次のようなテーブルに保存します: operations(operation-id, operation-url, operation-status)。
これが準備できたら、次のことを行う短い PHP スクリプトを設計しました。
<?php
if( WORKER_IS_ONLINE !== true ) exit();
OperationsQueue::CleanQueue();
while( OperationsQueue::RunningOperations() < WORKER_MAX_OPERATIONS ) {
launch_operation( OperationsQueue::DequeOperation() );
}
sleep( WORKER_SLEEP_TIME );
launch_operation( '/operations_queue/deque' );
この補助関数 (launch_operation
およびOperationsQueue
クラス) は次のように動作します (まだ実装されていないことに注意してください)。
<?php
define('WORKER_SLEEP_TIME', 15); // Time to sleep between sweeps.
define('WORKER_HOST', 'localhost'); // Hostname where the operations will be performed.
define('WORKER_PORT', 80); // Port where the operations will be performed.
define('WORKER_SOCKET_TIMEOUT', 80); // Port where the operations will be performed.
define('WORKER_MAX_OPERATIONS', 2); // Max simultaneous operations.
define('WORKER_MAX_LAUNCHES', 2); // Max operations launched within a sweep.
define('WORKER_IS_ONLINE', false); // Bool value that marks whether the worker must be working or not.
function launch_operation($operation) {
$fp = fsockopen(WORKER_HOST, WORKER_PORT, $errno, $errstr, WORKER_SOCKET_TIMEOUT);
if ($fp) {
$out = 'GET ' . $operation . " HTTP/1.1\r\n";
$out .= 'Host: ' . WORKER_HOST . "\r\n\r\n";
fwrite($fp, $out);
fclose($fp);
}
}
class OperationsQueue {
public static function RunningOperations(){
// connect to DB an perform: SELECT COUNT(*) FROM operations WHERE status = 'PROCESSING';
return 1;
}
public static function CleanQueue(){
// connect to DB an perform: DELETE FROM operations WHERE status IN ('DONE', 'CANCELED');
}
public static function DequeOperation(){
// connect to DB an perform: SELECT * FROM operations WHERE status = 'PENDING' ORDER BY id ASC LIMIT 0, 1;
// UPDATE operations SET status = 'PROCESSING', tries = tries+1 WHERE id = $id;
return 'operation_url';
}
}
他の人にも役立つと思いました。ご覧のとおり、操作が連鎖しています。