<?php 
/** 
 * MesQ, PHP disk based message lite queue manager 
 * 
 * Copyright 2021 Kjell-Inge Gustafsson, kigkonsult, All rights reserved 
 * Link      https://kigkonsult.se 
 * Package   MesQ 
 * Version   1.05 
 * License   LGPL 
 * 
 * This file is a part of MesQ. 
 * 
 * This php script read test messages 
 * 
 * messageReader.php 
 * Usage 
 * php -f /path/to/MesQ/test/messageReader.php arg1 arg2 arg3 
 * 
 * arguments : 
 * 0 : '/path/to/MesQ/test/messageReader.php' 
 * 1 : directory 
 * 2 : read chunk size 
 * 3 : return chunk size 
 * 4 : opt prio, single or min, force queueType to PRIO 
 * 5 : opt prio max, only if min is set 
 */ 
declare( strict_types = 1 ); 
namespace Kigkonsult\MesQ; 
 
use function getmypid; 
use function intval; 
use function microtime; 
use function realpath; 
use function sprintf; 
 
include realpath( '../autoload.php' ); 
include realpath( './test.inc.php' ); 
 
static $FMT1 = 'pid %d %s : message %s%s'; 
static $FMT2 = 'pid %s : %sread %d messages in %s sec%s'; 
static $WAIT = 'wait for any prio message'; 
static $FMT4 = 'count messages : '; 
static $FMT5 = 'count bytes    : '; 
static $SP0  = ''; 
static $TTL  = 'total '; 
 
// load args and prepare config 
list( $queueName, $directory ) = getArgv1and2( $argv ); 
$config = [ MesQ::QUEUENAME => $queueName, MesQ::DIRECTORY => $directory ]; 
if( isArgSet( $argv, 3 )) { 
    $config[MesQ::READCHUNKSIZE] = intval( $argv[3] ); 
} 
if( isArgSet( $argv, 4 )) { 
    $config[MesQ::RETURNCHUNKSIZE] = intval( $argv[4] ); 
} 
// set up 
$time = microtime( true ); 
$pid  = getmypid(); 
$prio = null; 
$mesq = MesQ::singleton( $config ); 
if( isArgSet( $argv, 5 )) { 
    $prio = intval( $argv[5] ); 
    if( isArgSet( $argv, 6 )) { 
        $prio = [ $prio, intval( $argv[6] ) ]; 
    } 
    $mesq->setQueueType( MesQ::PRIO ); 
} 
$mesq = MesQ::singleton( $config ); // test, should be factory method 
echo $mesq->configToString() . PHP_EOL; 
// check fot opt priority messages 
$cnt  = $cnt2 = 0; 
$time2 = $time; 
if( $mesq->isQueueTypePrio()) { 
    while( ! $mesq->messageExist( $prio )) { 
        if( true !== time_nanosleep( 0, 10000000 )) { // 0.01 sec 
            sleep( 1 ); 
        } 
        echo $WAIT . PHP_EOL; // test 
    } // end while 
} // end if 
echo $FMT4 . var_export( $mesq->size(), true ) . PHP_EOL; // test ### 
echo $FMT5 . $mesq->GetDirectorySize() . PHP_EOL; 
// retrieve messages 
while( $message = $mesq->getMessage( $prio )) { 
    $cnt  += 1; 
    echo sprintf( $FMT1, $pid, getTime( $time ), $message->ToString(), PHP_EOL ); 
    $cnt2 += 1; 
    if( 0 == ( $cnt % 1000 )) { 
        echo sprintf( $FMT2, $pid, $SP0, $cnt2, getTime( $time2 ), PHP_EOL ); 
        $time2 = microtime( true ); 
        $cnt2  = 0; 
        echo $FMT4 . var_export( $mesq->size(), true ) . PHP_EOL; // test ### 
        echo $FMT5 . $mesq->GetDirectorySize() . PHP_EOL; 
    } // end if 
    /* 
    // should emulate some php logic here, wait 10000000 (0.01) sec, 
    if( true !== time_nanosleep( 0, 10000000 )) { 
        sleep( 1 ); 
    } 
    */ 
} // end while 
echo sprintf( $FMT2, $pid, $TTL, $cnt, getTime( $time ), PHP_EOL ); 
 
 |