EC-CUBE4で商品画像の仮アップロード画像が残ってしまうのが気になったので、定期的に削除するバッチを作成しました。
仕組みは単純で、アップロードから◯日以上経った画像を削除するというものです。
(スクラッチでもよく作りますが、今回はEC-CUBE4での実装です)
なぜ◯日以上なのかは、(cron動かすのは大抵夜中なのでないとは思いますが)たまたま商品登録してた場合に仮アップロード画像が消えてしまうのを避けるためです。
EC-CUBE4でのバッチ処理の基本的な作り方はこちらから
<?php
namespace Customize\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Filesystem\Filesystem;
/**
* 仮アップロード画像(/upload/temp_image/)内の画像を削除する
*/
class TempImageRemoveCommand extends Command
{
protected static $defaultName = 'eccube:customize:temp_image-remove';
public function __construct(
) {
parent::__construct();
// 今回は3日以上経ったものを削除対象にします
$this->deleteLastDate = -3;
}
protected function configure()
{
$this
-gt;setDescription('Temp Image remove');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
// パスは環境に合わせてください。
$tempImageDirPath = "/upload/temp_image/";
$lastDate = date("Y-m-d", strtotime("{$this->deleteLastDate} day"));
// 対象はJPG PNG GIF
$images = glob($tempImageDirPath . '{*.jpg,*.jpeg,*.png,*.gif}', GLOB_BRACE);
$fs = new Filesystem();
foreach ($images as $image) {
// タイムスタンプを日付のフォーマットに変更
$fileTimestamp = date("Y-m-d", filemtime($image));
// ◯日より前の画像なら削除
if($fileTimestamp < $lastDate) { $fs->remove($image);
}
}
}
}
これでcronなどで毎日夜中に動かしてやればいらない画像が削除できます。
(稼働中の本番サーバでは慎重にやってください。画像が消えちゃうとかなり面倒なので…)
正直、仮アップロード画像は残していてもゴミデータですので、定期的に消してやると容量を圧迫することもなくなるはずです。