اصلاح تکمیل سینک ژوپینگ - 2026-08-19
====================================

علت قطعی پیدا شده در لاگ‌های بسته ارسالی:
- منبع 1444 محصول را کامل پیدا می‌کند.
- اجرای PHP با خطای Maximum execution time of 30 seconds قبل از پایان می‌میرد.
- اجرای بعدی دوباره از ابتدای دسته شروع می‌شود؛ بنابراین بخش انتهایی دسته هیچ‌وقت پردازش نمی‌شود.
- sync_map داخل state.json فقط 234 نگاشت داشت.

این نسخه چه می‌کند:
- هر اجرا از محل توقف قبلی ادامه می‌دهد (data_xuping/scan_progress.json).
- قبل از سقف 30 ثانیه امن متوقف می‌شود و اجرای بعدی ادامه می‌دهد.
- نگاشت محصولات را در journal سبک data_xuping/sync_map.jsonl می‌نویسد و دیگر برای هر رنگ
  فایل چندمگابایتی state.json را کامل decode/encode نمی‌کند.
- برای جلوگیری از جاافتادن محصولی که وسط درخواست قطع شده، یک محصول هم‌پوشانی دارد؛
  sync-map مانع ساخت تکراری همان محصول می‌شود.
- متغیر اشتباه BASE_URL داخل main نیز اصلاح شده است.

نصب امن روی سرور
----------------
1) فایل zip اصلاحی را داخل این مسیر آپلود کنید:
   /home/aminzari/public_html/xuping_mixin_full_bundle

2) سپس اجرا کنید (نام zip را مطابق نام فایل آپلودی بگذارید):

cd /home/aminzari/public_html/xuping_mixin_full_bundle
cp check_xuping_mixin_sync.php check_xuping_mixin_sync.php.backup_20260819
unzip -o xuping_completeness_hotfix_20260819.zip
php -l check_xuping_mixin_sync.php
php -l xuping_sync_status.php
grep -n XUPING_COMPLETENESS_FIX check_xuping_mixin_sync.php

خروجی grep باید عبارت resumable-journal-v2-2026-08-19 را نشان دهد.

مهم: state.json را حذف نکنید. پوشه data_xuping را نیز پاک نکنید.

اجرای آزمایشی
-------------
php check_xuping_mixin_sync.php

خروجی سالم باید حداقل خط‌های START و BATCH و در پایان OK را داشته باشد. نمونه:
START patch=resumable-journal-v2-2026-08-19 baseline=0
BATCH category=511736 total=1444 start=0 selected=80 next=80
...
OK

اگر TIME_BUDGET_STOP دیده شد خطا نیست؛ یعنی اجرای بعدی دقیقاً ادامه می‌دهد.

کرون پیشنهادی
-------------
لاگ ارسالی نشان می‌داد اجراها عمدتاً هر 8 ساعت بودند. برای پر شدن عقب‌افتادگی، کرون را موقتاً
هر 5 دقیقه اجرا کنید. خط کرون را مستقیم مثل یک دستور shell اجرا نکنید؛ آن را در بخش
Cron Jobs سی‌پنل وارد کنید:

*/5 * * * * /usr/local/bin/php -q /home/aminzari/public_html/xuping_mixin_full_bundle/check_xuping_mixin_sync.php >> /home/aminzari/public_html/xuping_mixin_full_bundle/data_xuping/cron_out.log 2>> /home/aminzari/public_html/xuping_mixin_full_bundle/data_xuping/cron_err.log

یا برای ثبت از خود ترمینال، این دستور یک‌خطی را اجرا کنید:

( crontab -l 2>/dev/null | grep -v 'check_xuping_mixin_sync.php'; echo '*/5 * * * * /usr/local/bin/php -q /home/aminzari/public_html/xuping_mixin_full_bundle/check_xuping_mixin_sync.php >> /home/aminzari/public_html/xuping_mixin_full_bundle/data_xuping/cron_out.log 2>> /home/aminzari/public_html/xuping_mixin_full_bundle/data_xuping/cron_err.log' ) | crontab -

سپس ثبت شدن آن را بررسی کنید:

crontab -l | grep check_xuping_mixin_sync.php

قفل run.lock اجازه هم‌زمان شدن دو اجرا را نمی‌دهد. بعد از اینکه یک دور کامل شد، می‌توانید
کرون را روی هر 10 دقیقه بگذارید.

دیدن وضعیت
-----------
php xuping_sync_status.php

وقتی این خط حداقل 1 شد، یک دور کامل همه محصولات منبع پیمایش شده است:
CATEGORY_COMPLETED_CYCLES_511736=1

UNIQUE_MAPPED_SOURCE_PRODUCTS تعداد محصول‌های منبعی است که حداقل یک نگاشت مقصد دارند.
EFFECTIVE_DESTINATION_MAPPINGS ممکن است بیشتر باشد، چون هر رنگ ژوپینگ به یک محصول مستقل
در مقصد تبدیل می‌شود.

بررسی آخرین خطاها:
tail -n 80 data_xuping/cron_err.log
tail -n 120 data_xuping/cron_trace.log
