سؤال

في مشروع أعمل معه حاليًا ، نفكر في وضعه system() في php.ini disable_functions إعلان. الآن ، هناك وحدة تلوي واحدة لنا والتي من شأنها أن تقع في النهاية ضحية لهذا التقييد هي ملفات فحص بناء الجملة مع system("php -l"); مكالمات - دفعني للبحث عن البدائل.

اتضح أن هناك php_check_syntax(), ولكن ليس فقط لم يقتصر على فحص بناء الجملة فقط واستمر في تضمين الملف إذا كان صحيحًا بشكل نحلي ، ولكن تمت إزالته اعتبارًا من PHP 5.0.5. الدليل يقترح php -l في مكانها ، ولكن بالنظر إلى أنني متأكد من أن تعطيل وظائف الاتصال في النظام في PHP هي ممارسة شائعة إلى حد ما ، فأنا أتساءل عما إذا كانت هناك طريقة مقبولة ، "أفضل" للتحقق من ملفات PHP من داخل ملفات PHP.

(أنا لست عازمًا على هذا ، بالمناسبة ؛ "لا" كافي تمامًا (وأتوقع ذلك حقًا). نحن حقًا). نحن يستطيع إعاقة الوحدة النمطية من هذا التقييد - لكنني أطرح هذا السؤال بدافع الفضول وكذلك على أمل حل أكثر رشاقة.)

هل كانت مفيدة؟

المحلول

لقد وجدت بديلاً باستخدام PECL runkit_lint_file ().

يفعل نفس الفحص مثل php_check_syntax ().

أعتقد أنه يستحق نظرة.

نصائح أخرى

يمكن أن يكون هذا أيضًا خيارًا:متى (إن وجدت) ليست شريرة؟

ويبدو أسرع أكثر:

$nTestTiempo0 = microtime(true);
exec('php -l yourfile.php',$arrMsgError,$nCodeError);
$nTestTiempo1 = microtime(true);
echo "\n", '<p>Time in verify file with exec : '.($nTestTiempo1-$nTestTiempo0).' secs.</p>';
//Time in verify file with exec : 0.033198118209839 secs.

$nTestTiempo0 = microtime(true);
ob_start ();
var_dump(eval('return true; if(0){?>'.file_get_contents('yourfile.php').'<?php };'));
$arrMsgError = explode("\n",trim(ob_get_contents()));
ob_end_clean();
$nTestTiempo1 = microtime(true);
echo "\n", '<p>Time in verify file with eval : '.($nTestTiempo1-$nTestTiempo0).' secs.</p>';
//Time in verify file with eval : 0.00030803680419922 secs.

$nTestTiempo0 = microtime(true);
@system('php -l yourfile.php',$nCodeError);
$nTestTiempo1 = microtime(true);
echo "\n", '<p>Time in verify file with system : '.($nTestTiempo1-$nTestTiempo0).' secs.</p>';
//Time in verify file with system : 0.032964944839478 secs.

انظر لدينا تنسيق PHP. تأخذ أداة سطر الأوامر ملف PHP وتنسيقه جيدًا.

لا يقتصر الأمر على تنسيقه ، بل إنه يقوم أيضًا بالتحقق من بناء الجملة ، ويُرجع حالة سطر الأوامر الذي يخبرك ما إذا كان الملف "تم تشكيله جيدًا" ؛ أنه يحتوي على محلل PHP 5 كامل. نظرًا لأنها أداة سطر الأوامر ، سيكون من السهل إطلاقها من برنامج نصي PHP إذا كان هذا هو ما عليك القيام به ، ومن خلال التحقق من الحالة التي تم إرجاعها ، ستعرف ما إذا كان الملف قانونيًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top