رفع خطای ناسازگاری نسخه ionCube با PHP

خطاهایی مثل «requires a newer version of the ionCube Loader» یعنی نسل انکدری که فایل با آن ساخته شده از نسخه لودر روی سرور مقصد جلوتر است. راه‌حل یا آپدیت لودر سرور است یا انکد مجدد با نسل پایین‌تر؛ نه هر دو. در این مقاله انواع پیام‌های خطای نسخه و راه‌حل دقیق هر کدام را می‌بینید.

این مقاله در یک نگاه

  • قانون طلایی: لودر باید مساوی یا جدیدتر از نسل انکدر باشد.
  • لودر جدید فایل قدیمی را می‌خواند، اما لودر قدیمی فایل جدید را نه.
  • اگر به سرور دسترسی دارید، آپدیت لودر ساده‌ترین راه است.
  • اگر مقصد نامعلوم است، هنگام انکد نسل پایین‌تر انتخاب کنید.
  • خطای نسخه PHP با خطای نسل انکدر فرق دارد و راه‌حلشان یکی نیست.

قانون سازگاری نسخه‌ها

ionCube یک قانون ساده دارد که همه خطاهای نسخه از آن ناشی می‌شود: نسخه لودر روی سرور باید مساوی یا جدیدتر از نسل انکدری باشد که فایل با آن ساخته شده است.

دلیل این قانون فنی است. هر نسل انکدر قالب خروجی جدیدی معرفی می‌کند که لودرهای قبلی آن را نمی‌شناسند. قالب رو به جلو سازگار است، یعنی لودر نسخه ۱۵ می‌تواند خروجی نسل‌های ۱۳ و ۱۴ را هم اجرا کند؛ اما لودر نسخه ۱۳ هیچ راهی برای خواندن خروجی نسل ۱۵ ندارد.

انواع پیام خطا و معنی هرکدام

تشخیص درست پیام، مسیر حل را کوتاه می‌کند. سه دسته اصلی وجود دارد و راه‌حل هر کدام متفاوت است.

پیام خطامعنیراه‌حل
requires a newer version of the ionCube Loaderلودر سرور قدیمی‌تر از نسل انکدر استلودر را آپدیت کنید یا با نسل پایین‌تر انکد کنید
was encoded for a different PHP versionفایل برای نسخه PHP دیگری ساخته شدهخروجی را برای نسخه PHP سرور بگیرید
corrupted fileفایل ناقص منتقل شده یا نسخه نامتناسب استدوباره و به صورت باینری آپلود کنید
needs to be installedلودر اصلا فعال نیستراهنمای نصب لودر
تفاوت مهم خطای «نسل انکدر» و خطای «نسخه PHP» دو چیز متفاوتند. اولی به شماره نسل ionCube برمی‌گردد و دومی به نسخه PHP هدف. جدول سازگاری نسخه‌های PHP در این مقاله آمده است.

راه‌حل وقتی به سرور دسترسی دارید

اگر سرور در اختیار خودتان است یا مشتری دسترسی می‌دهد، ساده‌ترین و بهترین راه آپدیت لودر است. بعد از آپدیت، همان فایل قبلی بدون هیچ تغییری اجرا می‌شود و نیازی به انکد مجدد نیست.

روی هاست‌های کنترل‌پنلی معمولا کافی است ابزار سازنده را دوباره اجرا کنید؛ در دایرکت‌ادمین دستور ./build ioncube و در سی‌پنل از طریق EasyApache. روی سرور بدون کنترل‌پنل باید فایل .so جدید را جایگزین کنید. مراحل کامل در به‌روزرسانی نسخه ionCube Loader آمده است.

راه‌حل وقتی دسترسی ندارید

اگر محصول را به مشتری می‌فروشید و نمی‌دانید سرورش چه لودری دارد، نمی‌توانید روی آپدیت حساب کنید. در این حالت باید سمت خودتان کار کنید.

راه‌حل این است که هنگام انکد، نسل انکدر پایین‌تری انتخاب کنید. خروجی نسل پایین‌تر روی طیف وسیع‌تری از سرورها اجرا می‌شود، چون هم لودرهای قدیمی و هم جدید آن را می‌شناسند. در سرویس ما می‌توانید نسل انکدر و نسخه هدف PHP را دستی انتخاب کنید.

چطور از این خطا پیشگیری کنیم؟

وضعیتانتخاب پیشنهادی
سرور مقصد را می‌شناسم و به‌روز استجدیدترین نسل برای حداکثر امنیت
فروش عمومی به مقصد نامعلومنسل پایین‌تر برای حداکثر سازگاری
مشتری سازمانی با سرور قدیمینسل متناسب با لودر موجود سرور
چند مشتری با شرایط متفاوتخروجی جداگانه برای هر گروه

یک عادت خوب این است که پیش از تحویل، از مشتری بپرسید نسخه PHP و وضعیت لودر هاستش چیست. یک پیام کوتاه در ابتدای کار، از رفت و برگشت‌های بعدی جلوگیری می‌کند. برای شناخت پایه‌ای‌تر موضوع، ionCube Loader چیست و ionCube Encoder چیست را ببینید. اطلاعات رسمی نسخه‌ها در سایت ionCube در دسترس است.

جمع بندی: خطای ناسازگاری نسخه تقریبا همیشه یک معنی دارد: لودر سرور مقصد از نسل انکدر عقب‌تر است. اگر به سرور دسترسی دارید، آپدیت لودر ساده‌ترین راه است و فایل قبلی بدون تغییر اجرا می‌شود. اگر دسترسی ندارید، هنگام انکد نسل پایین‌تری انتخاب کنید تا خروجی روی سرورهای بیشتری کار کند. پرسیدن نسخه PHP و لودر از مشتری پیش از تحویل، بهترین پیشگیری است.

سوالات متداول

چرا لودر جدیدتر فایل قدیمی را می‌خواند اما برعکس نه؟

چون قالب بایت‌کد رو به جلو سازگار است؛ لودر جدید فرمت‌های قدیمی را می‌شناسد ولی لودر قدیمی فرمت جدید را نمی‌شناسد.

بدون انکد مجدد می‌توانم حلش کنم؟

بله، اگر به سرور دسترسی دارید فقط لودر را آپدیت کنید. همان فایل بدون تغییر اجرا خواهد شد.

برای سازگاری بیشتر چه نسلی انتخاب کنم؟

اگر مقصد نامعلوم است نسل پایین‌تر انتخاب کنید تا روی سرورهای بیشتری اجرا شود.

خطای نسخه PHP با خطای نسل انکدر فرق دارد؟

بله. اولی یعنی خروجی برای نسخه PHP دیگری ساخته شده و دومی یعنی لودر از نسل انکدر عقب‌تر است.

چطور بفهمم فایل با چه نسلی انکد شده؟

معمولا در پیام خطا اشاره می‌شود. اگر خودتان انکد کرده‌اید، نسل انتخابی در سوابق سفارش شما ثبت است.

مطالب مرتبط: به‌روزرسانی لودر · سازگاری با PHP ۸.۳ و ۸.۴ · رفع خطای نبود لودر