إعداد ionCube Loader لإصدارات NextPDF التجارية
نظرة سريعة
قسم بعنوان «نظرة سريعة»تُسلَّم بعض توزيعات NextPDF التجارية على هيئة PHP مُرمَّز بـ ionCube، لذا يجب تثبيت ionCube Loader المطابق في وقت تشغيل PHP لديك قبل أن يعمل الكود. ينطبق ذلك على:
- إصدارات التقييم من NextPDF Pro وEnterprise، و
- الإصدار الرسمي (المدفوع) من NextPDF Pro.
أما تسليم الإصدار الرسمي من NextPDF Enterprise، فتعتمد آلية تغليفه على اتفاقيتك. اتبع تعليمات التسليم الواردة في شروط ترخيصك بدلًا من افتراض وقت تشغيل بعينه؛ راجع الترخيص والتفعيل.
هذه الصفحة دليل إعداد عملي: ما هو ionCube، وكيفية تثبيت Loader والتحقق منه، وأين يوضع ملف الترخيص لإصدار Pro المدفوع المُرمَّز بـ ionCube، وكيفية تشغيله في الحاويات، وكيفية إصلاح الأعطال الشائعة. إصدار PHP المدعوم هو 8.4، ويجب أن يطابق Loader الذي تثبِّته وقت التشغيل ذاك تمامًا.
ما هو ionCube ولماذا يستخدمه NextPDF
قسم بعنوان «ما هو ionCube ولماذا يستخدمه NextPDF»ionCube مُرمِّز PHP تجاري يقترن بمكوِّن وقت تشغيل مجاني يسمى ionCube Loader. هذا Loader امتداد PHP (Zend). عند بدء تشغيل PHP، يتيح Loader فك ترميز الملفات المُرمَّزة وتنفيذها؛ ودونه لا يمكن تشغيل ملف مُرمَّز، ويُبلِّغ PHP عن خطأ في Loader بدلًا من ذلك.
يستخدم NextPDF ترميز ionCube لحماية المصدر التجاري المملوك مع الاستمرار في تسليم PHP قابل للتثبيت تنشره وتشغِّله مثل أي حزمة Composer أخرى. لا يُغيِّر الترميز طريقة استدعائك للمكتبة — إذ يستهدف تطبيقك العقود العامة نفسها — بل يضيف فقط اشتراط وجود Loader في وقت التشغيل.
للحصول على تنزيلات Loader والتعليمات الموثوقة الخاصة بكل إصدار، استخدم وثائق المورِّد على ioncube.com (وثائق ionCube Loader ودليل التثبيت). تغطي هذه الصفحة الإعداد الخاص بـ NextPDF؛ أما المورِّد فهو مصدر الحقيقة بشأن Loader ذاته.
المتطلبات
قسم بعنوان «المتطلبات»ثبِّت ionCube Loader المطابق لوقت تشغيل PHP لديك على كل محور. فعدم التطابق في أي واحد منها هو أكثر أسباب الفشل شيوعًا:
| المحور | يجب أن يطابق |
|---|---|
| إصدار PHP | 8.4 (يتطلب NextPDF التجاري >=8.4 <9.0). |
| نظام التشغيل | نظام التشغيل الذي تستهدفه حزمة Loader (Linux أو Windows أو macOS). |
| البنية | بنية المعالج للمضيف، وهي عادةً 64-بت (x86-64 أو aarch64). |
| أمان الخيوط | غير آمن للخيوط (NTS) أو آمن للخيوط (ZTS)، بما يطابق بنية PHP لديك. |
علاوة على Loader، تحتاج أيضًا إلى:
- حزمة NextPDF التجارية مثبَّتة عبر Composer —
nextpdf/proأوnextpdf/enterpriseأو حزمة meta المسماةnextpdf/premium. - بالنسبة إلى الإصدارات المدفوعة، ملف الترخيص الخاص بك. أما إصدار Pro المدفوع المُرمَّز بـ ionCube، فراجع وضع ملف الترخيص أدناه.
لقراءة قيم بنيتك الحالية، شغِّل php -i (أو استدعِ phpinfo()) وتحقق من
أسطر PHP Version وArchitecture وThread Safety. في معظم عمليات نشر
CLI وPHP-FPM يكون أمان الخيوط معطَّلًا (NTS)؛ بينما يكون Apache
الكلاسيكي بنمط mod_php على بعض المنصات ZTS. نزِّل حزمة Loader
لتلك القيم بالضبط.
تثبيت Loader
قسم بعنوان «تثبيت Loader»الخطوات أدناه هي المسار العام. ارجع إلى وثائق ionCube Loader على ioncube.com للاطلاع على أسماء الملفات الدقيقة وبنية الأدلة في الحزمة الحالية.
-
نزِّل حزمة Loader المطابقة لبيئتك (PHP 8.4، ونظام تشغيلك، والبنية، وNTS/ZTS). تحتوي الحزمة على ملف loader واحد لكل إصدار من PHP ولكل صيغة من أمان الخيوط.
-
ضع ملف loader في دليل امتدادات PHP. استخدم
extension_dirالمُبلَّغ عنه منphp -i. على Linux/macOS يكون الملفioncube_loader_<os>_8.4.so(استخدم..._8.4_ts.soلبنية ZTS)؛ وعلى Windows يكونioncube_loader_win_8.4.dll(أو صيغة ZTS المسماة..._ts.dll). -
سجِّله في
php.iniبوصفهzend_extension. يجب أن يُحمَّل ionCube Loader بوصفهzend_extension، لاextensionعادي، وينبغي أن يُحمَّل قبل الامتدادات الأخرى. أضف سطرًا واحدًا، مستخدمًا مسارًا مطلقًا إلى ملف loader:zend_extension=/full/path/to/ioncube_loader_lin_8.4.soعلى Windows، استخدم المسار الكامل إلى ملف
.dll:zend_extension="C:\php\ext\ioncube_loader_win_8.4.dll"إذا كانت منصتك تستخدم أدلة تضمين بنمط
conf.d، فضع هذا السطر في ملف يُقرأ مبكرًا (مثلًا00-ioncube.ini) كي يُهيَّأ Loader قبل الامتدادات الأخرى. -
أعد تشغيل وقت تشغيل PHP. أعد تشغيل PHP-FPM، أو خادم الويب لديك (Apache/Nginx)، أو ببساطة أعد تشغيل CLI — أيًّا كان ما يشغِّل تطبيقك. تحتفظ العملية طويلة الأمد بالتهيئة القديمة حتى إعادة تشغيلها.
التحقق
قسم بعنوان «التحقق»تأكد من أن Loader نشط قبل محاولة تحميل NextPDF.
أولًا، تحقق من لافتة إصدار PHP. عند تثبيت Loader، يُلحِق php -v سطرًا
يسميه:
php -vPHP 8.4.x (cli) ... with Zend OPcache v8.4.x, ... with the ionCube PHP Loader ...عبارة “with the ionCube PHP Loader” هي الإشارة إلى أن Loader نشط
لوقت التشغيل ذاك. أما في عملية نشر ويب (FPM / mod_php)، فلا تكفي لافتة
CLI — إذ يمكن لذلك الوقت أن يستخدم ملف php.ini مختلفًا. تأكد من وقت
تشغيل الويب عبر سكربت صغير يقدِّمه خادم الويب:
<?php// loader-check.php — delete after verifying.var_dump(extension_loaded('ionCube Loader'));phpinfo(); // The output includes an "ionCube PHP Loader" section when active.أخيرًا، تأكد من أن صنف NextPDF التجاري يُحمَّل فعليًا عبر مُحمِّل التحميل التلقائي في Composer. يثبت ذلك أن الكود المُرمَّز يعمل من البداية إلى النهاية:
<?phprequire __DIR__ . '/vendor/autoload.php';
// A premium class resolves only when the Loader can decode the package.var_dump(class_exists(\NextPDF\Pro\Document\PdfPortfolio::class));إذا سمى php -v Loader، وأظهر phpinfo() للويب قسم ionCube، وتحقق
صنف Pro، فإن Loader مُعدٌّ بشكل صحيح.
وضع ملف الترخيص (إصدار Pro المدفوع المُرمَّز بـ ionCube)
قسم بعنوان «وضع ملف الترخيص (إصدار Pro المدفوع المُرمَّز بـ ionCube)»يستخدم ionCube نموذج ترخيص بسيطًا: يتحقق الكود المُرمَّز من وجود ملف ترخيص وقت التشغيل، ويرفض العمل عندما يكون الملف مفقودًا أو غير قابل للقراءة أو منتهيًا. ينطبق هذا على إصدار Pro المدفوع المُرمَّز بـ ionCube — إذ تضع له ملف الترخيص الذي يوفره شراؤك في موضع يجده وقت التشغيل.
آلية ملف ترخيص ionCube هذه خاصة بالإصدار المُرمَّز بـ ionCube. ولا يُفترض هنا أن تسليم الإصدار الرسمي من NextPDF Enterprise مُرمَّز بـ ionCube؛ إذ تحكم تغليفه ومعالجة ترخيصه شروط ترخيصك — راجع الترخيص والتفعيل.
المسارات الدقيقة خاصة بالبيئة، لذا أبقِ هذا عامًا:
- ضع ملف الترخيص في الموضع الذي تحدده تعليمات تسليم NextPDF لديك — وعادةً بجوار الحزمة المُرمَّزة أو في دليل يستطيع التطبيق قراءته. تأكد من أن مستخدم عملية PHP يملك إذن القراءة.
- لا تُعِد تسمية الملف ما لم تنص تعليماتك على ذلك؛ فإن loader يبحث عن اسم محدد.
- في الحاويات وعمليات النشر للقراءة فقط، ضمِّن ملف الترخيص أو انسخه داخل الصورة، أو ضمِّنه في مسار قابل للكتابة والقراءة يراه وقت التشغيل (راجع Docker والحاويات).
يحكم ملف الترخيص التفعيل على مستوى وقت التشغيل؛ وهو منفصل عن الترخيص على مستوى التطبيق الذي يختار إصدارك وميزاته. للاطلاع على الشروط والمدد وما يخوِّله اشتراكك، راجع الترخيص والتفعيل واتفاقية ترخيصك — فهذه الصفحة لا تُعرِّف شروط الترخيص.
استكشاف الأخطاء وإصلاحها
قسم بعنوان «استكشاف الأخطاء وإصلاحها»”Loader not installed” / “Failed loading … ioncube_loader”
قسم بعنوان «”Loader not installed” / “Failed loading … ioncube_loader”»Loader غير نشط في وقت التشغيل الذي شغَّل الكود، أو أن المسار خاطئ. أعد
التحقق من أن سطر zend_extension يشير إلى ملف موجود بمسار مطلق، وأنك أعدت
تشغيل وقت التشغيل، وأنك تحققت من وقت التشغيل نفسه (CLI مقابل FPM)
عبر php -v / phpinfo(). عادةً ما تعني رسالة Failed loading أن الملف
موجود لكنه لا يطابق بنية PHP (راجع البند التالي).
عدم تطابق إصدار PHP أو NTS/ZTS أو البنية
قسم بعنوان «عدم تطابق إصدار PHP أو NTS/ZTS أو البنية»لن يُحمَّل Loader المبني لإصدار PHP مختلف، أو لنمط أمان خيوط مختلف، أو
لبنية مختلفة. تأكد من PHP Version وThread Safety وArchitecture من
php -i، ثم ثبِّت ملف Loader لـ PHP 8.4 بما يطابق NTS/ZTS
وعدد البتات. لاحقة 8.4 مقابل 8.4_ts (أو _ts.dll) هي محدِّد أمان
الخيوط — واستخدام اللاحقة الخاطئة خطأ متكرر.
ترتيب تحميل Loader
قسم بعنوان «ترتيب تحميل Loader»يجب أن يكون ionCube Loader من نوع zend_extension وأن يُهيَّأ قبل
الامتدادات الأخرى. إذا رأيت تحذيرات بشأن تحميل Loader بعد الامتدادات
الأخرى، فحرِّك سطر zend_extension الخاص به إلى موضع أبكر — أو، مع
بنية conf.d، امنح ملف تضمينه اسمًا يأتي أولًا في الترتيب (مثلًا
00-ioncube.ini).
يستخدم CLI وFPM وخادم الويب ملفات php.ini مختلفة
قسم بعنوان «يستخدم CLI وFPM وخادم الويب ملفات php.ini مختلفة»كثيرًا ما يُحمِّل PHP ملف php.ini مختلفًا لـ CLI عن ذلك المُحمَّل لـ
PHP-FPM أو mod_php. وتهيئة CLI وحدها تترك وقت تشغيل الويب دون Loader
(أو العكس). شغِّل php --ini لمعرفة الملف الذي يستخدمه CLI، وتحقق من
سطر Loaded Configuration File في ناتج phpinfo() للويب. أضف سطر
zend_extension إلى كل ملف php.ini يشغِّل NextPDF، وأعد تشغيل كل
وقت تشغيل.
ملف الترخيص غير موجود أو منتهٍ
قسم بعنوان «ملف الترخيص غير موجود أو منتهٍ»بالنسبة إلى إصدار Pro المدفوع المُرمَّز بـ ionCube، يوقِف ملفُ ترخيص مفقود أو غير قابل للقراءة أو منتهٍ تشغيلَ الكود المُرمَّز. تحقق من أن الملف في الموضع المتوقع، وأن مستخدم عملية PHP يستطيع قراءته، وأنه لم ينتهِ. لأسئلة التجديد والمدة، راجع الترخيص والتفعيل واتفاقية ترخيصك.
تفاعلات OPcache
قسم بعنوان «تفاعلات OPcache»يخزِّن OPcache السكربتات المُترجَمة مؤقتًا، لكن الملفات المُرمَّزة بـ
ionCube يفك ترميزها Loader وقت التشغيل. إذا غيَّرت Loader أو تهيئته
وظل وقت التشغيل يتصرف كأنه غائب، فأعد تشغيل وقت تشغيل PHP (وهو ما يمسح
OPcache) بدلًا من الاعتماد على إعادة تحميل ساخنة. أبقِ zend_extension
الخاص بـ ionCube مسجَّلًا كي يُحمَّل قبل OPcache؛ فالاثنان يتعايشان،
وينبغي أن يُدرِج php -v كليهما.
Docker والحاويات
قسم بعنوان «Docker والحاويات»في عملية نشر بالحاويات، ثبِّت Loader داخل الصورة، وتأكد من أنه يطابق بنية PHP في الحاوية — لا بنية مضيفك. تُثبِّت الصورة الأساسية إصدار PHP ونظام التشغيل والبنية ونمط أمان الخيوط، لذا نزِّل حزمة Loader لتلك القيم.
بناء صورة نموذجي:
- ابدأ من صورة أساسية لـ PHP 8.4 (لاحظ ما إذا كانت NTS أم ZTS —
فالوسوم الرسمية
php:8.4-cli/8.4-fpm/8.4-apacheهي NTS، بينما الوسوم التي تتضمنztsآمنة للخيوط؛ اختر Loader ليطابقها). - أضف ملف ionCube Loader المطابق إلى
extension_dirالخاص بالصورة. - اكتب سطر
zend_extension=...في ملفphp.iniالخاص بالصورة (أو في ملف تضمين بنمطconf.d). - بالنسبة إلى إصدار Pro المدفوع المُرمَّز بـ ionCube، وفِّر ملف الترخيص بنسخه داخل الصورة أو بتضمينه وقت التشغيل في مسار تستطيع الحاوية قراءته.
ولأن Loader مبني داخل الصورة، تعمل الحاوية نفسها بصورة متطابقة في كل مكان. وإذا رقَّيت لاحقًا إصدار PHP في الصورة الأساسية، فاستبدل ملف Loader بالبنية التي تطابق وقت التشغيل الجديد.