2022-11-05 18:43:49 +08:00
< ? php
namespace App\Jobs ;
use App\Models\Setting ;
2023-07-10 02:33:27 +08:00
use App\Repositories\CleanupRepository ;
2022-12-26 00:55:14 +08:00
use Carbon\Carbon ;
2022-11-05 18:43:49 +08:00
use Illuminate\Bus\Queueable ;
use Illuminate\Contracts\Queue\ShouldBeUnique ;
use Illuminate\Contracts\Queue\ShouldQueue ;
use Illuminate\Foundation\Bus\Dispatchable ;
use Illuminate\Queue\InteractsWithQueue ;
use Illuminate\Queue\SerializesModels ;
use Nexus\Database\NexusDB ;
class UpdateUserSeedingLeechingTime implements ShouldQueue
{
use Dispatchable , InteractsWithQueue , Queueable , SerializesModels ;
private int $beginUid ;
private int $endUid ;
private string $requestId ;
2023-09-20 01:14:08 +08:00
private ? string $idStr = null ;
2023-07-15 01:44:48 +08:00
2024-02-21 21:11:16 +08:00
private string $idRedisKey ;
2022-11-05 18:43:49 +08:00
/**
* Create a new job instance .
*
* @ return void
*/
2024-02-21 21:11:16 +08:00
public function __construct ( int $beginUid , int $endUid , string $idStr , string $idRedisKey , string $requestId = '' )
2022-11-05 18:43:49 +08:00
{
$this -> beginUid = $beginUid ;
$this -> endUid = $endUid ;
2023-07-15 01:44:48 +08:00
$this -> idStr = $idStr ;
2024-02-21 21:11:16 +08:00
$this -> idRedisKey = $idRedisKey ;
2022-11-05 18:43:49 +08:00
$this -> requestId = $requestId ;
}
/**
* Determine the time at which the job should timeout .
*
* @ return \DateTime
*/
public function retryUntil ()
{
return now () -> addSeconds ( Setting :: get ( 'main.autoclean_interval_four' ));
}
2023-02-21 01:49:17 +08:00
public $tries = 1 ;
public $timeout = 3600 ;
2022-11-05 18:43:49 +08:00
/**
* Execute the job .
*
* @ return void
*/
public function handle ()
{
2023-07-22 02:04:41 +08:00
$beginTimestamp = time ();
$logPrefix = sprintf ( " [CLEANUP_CLI_UPDATE_SEEDING_LEECHING_TIME_HANDLE_JOB], commonRequestId: %s, beginUid: %s, endUid: %s " , $this -> requestId , $this -> beginUid , $this -> endUid );
2024-02-21 21:11:16 +08:00
$idStr = $this -> idStr ;
$delIdRedisKey = false ;
if ( empty ( $idStr ) && ! empty ( $this -> idRedisKey )) {
$delIdRedisKey = true ;
$idStr = NexusDB :: cache_get ( $this -> idRedisKey );
}
if ( empty ( $idStr )) {
do_log ( " $logPrefix , no idStr or idRedisKey " , " error " );
return ;
}
2024-11-07 03:35:21 +08:00
//批量取,简单化
$res = sql_query ( " select userid, sum(seedtime) as seedtime_sum, sum(leechtime) as leechtime_sum from snatched group by userid where userid in ( $idStr ) " );
$seedtimeUpdates = $leechTimeUpdates = [];
$nowStr = now () -> toDateTimeString ();
$count = 0 ;
while ( $row = mysql_fetch_assoc ( $res )) {
$count ++ ;
$seedtimeUpdates = sprintf ( " when %d then %d " , $row [ 'userid' ], $row [ 'seedtime_sum' ] ? ? 0 );
$leechTimeUpdates = sprintf ( " when %d then %d " , $row [ 'userid' ], $row [ 'leechtime_sum' ] ? ? 0 );
2023-07-22 02:04:41 +08:00
}
2024-11-07 03:35:21 +08:00
$sql = sprintf (
" update users set seedtime = case id %s end, leechtime = case id %s end, seed_time_updated_at = '%s' where id in (%s) " ,
implode ( " " , $seedtimeUpdates ), implode ( " " , $leechTimeUpdates ), $nowStr , $idStr
);
$result = sql_query ( $sql );
2024-02-21 21:11:16 +08:00
if ( $delIdRedisKey ) {
NexusDB :: cache_del ( $this -> idRedisKey );
}
2023-07-22 02:04:41 +08:00
$costTime = time () - $beginTimestamp ;
2024-11-07 03:35:21 +08:00
do_log ( sprintf (
" $logPrefix , [DONE], update user count: %s, result: %s, cost time: %s seconds " ,
$count , var_export ( $result , true ), $costTime
));
2022-11-05 18:43:49 +08:00
}
2023-03-04 01:13:41 +08:00
/**
* Handle a job failure .
*
* @ param \Throwable $exception
* @ return void
*/
public function failed ( \Throwable $exception )
{
do_log ( " failed: " . $exception -> getMessage () . $exception -> getTraceAsString (), 'error' );
}
2022-11-05 18:43:49 +08:00
}