في PHP، هل هناك طريقة لالتقاط مخرجات ملف PHP إلى متغير دون استخدام التخزين المؤقت للإخراج؟

StackOverflow https://stackoverflow.com/questions/222925

  •  03-07-2019
  •  | 
  •  

سؤال

في PHP، أريد قراءة ملف إلى متغير ومعالجة PHP في الملف في نفس الوقت دون استخدام التخزين المؤقت للإخراج.هل هذا ممكن؟

أريد في الأساس أن أكون قادرًا على تحقيق ذلك دون استخدام ob_start():

<?php
ob_start();
include 'myfile.php';
$xhtml = ob_get_clean();
?>

هل هذا ممكن في PHP؟

تحديث:أريد القيام ببعض الأشياء الأكثر تعقيدًا ضمن رد اتصال الإخراج (حيث لا يُسمح بالتخزين المؤقت للإخراج).

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

المحلول

وهناك سمة معروفة من PHP هو أن تكون قادرة لعلاج شملت / الملف المطلوب مثل استدعاء دالة، مع قيمة الإرجاع.

وعلى سبيل المثال:

// myinclude.php
$value = 'foo';
$otherValue = 'bar';
return $value . $otherValue;


// index.php
$output = include './myinclude.php';
echo $output;
// Will echo foobar

نصائح أخرى

ومن ما استطيع ان اقول في وثائق PHP، لا. لماذا كنت ترغب في تجنب إخراج التخزين المؤقت؟

والطريقة الوحيدة للتغلب على هذا سيكون أساليب hacky تنطوي إما استدعاء العميل سطر الأوامر فب أو القيام بطلب حليقة على أساس ما هو متاح وما هي متطلبات معينة.

وبعد قراءة اقتراحات الجميع، وقراءة مجموعة من الوثائق، واللعب حولها مع بعض الأشياء، خطرت لي هذه:

<?php
$file = file_get_contents('/path/to/file.php');
$xhtml = eval("?>$file");
?>

وانها أقرب ما أتمكن من الحصول على ولكن للأسف لا يعمل. المفتاح لهذا هو لتشمل قليلا إغلاق PHP (?>) قبل محتويات الملف. هذا وسوف تأخذ eval() من وضع PHP-التقييم وسوف يعامل محتويات الملف ابتداء كود غير PHP. ثم إذا كانت هناك كتل كود PHP داخل الملف، وسيتم تقييم هذه كما PHP. والمشكله هي أنه لا يحفظ محتوى eval'd في المتغير، هو فقط النواتج إلى الصفحة.

وشكرا للمساعدة الجميع!

واللاعب Joeri Sebrechts هو الصحيح. هو أسلوب مكافئ وأسهل قليلا متاح إذا كان البرنامج النصي PHP هو HTTP الوصول:

$data = file_get_contents('http://google.com/');

وتجدر الإشارة إلى أن استخدام الناتج التخزين المؤقت سيكون من الأسهل على الموارد.

هل طلب حليقة إلى صفحة بى، والتظاهر في الأساس ليكون المتصفح.

وماذا يمكن أن تفعله، إذا كان الملف المحلي، هو تحميل البرنامج النصي في متغير كسلسلة، ثم قم بتشغيل وحدة التقييم على السلسلة. ثم يمكنك أن تفعل كل ما تبذلونه من الأشياء الأخرى بعد ذلك. خلاف ذلك، لديك لاستخدام الناتج التخزين المؤقت.

$fileData = file_get_contents('fileOnDisk.php');
$results = eval($fileData);

ولكن التحقق من الوثائق على وحدة التقييم، لأن لديك فعلا أن يكون الملف الذي تتصل العودة نتائجه بدلا من مجرد صدى لها:

http://us2.php.net/eval

تنبيه الاختراق!يمكنك إجراء تقييم PHP بنفسك باستخدام القليل من القرصنة preg_replace_callback للبحث واستبدال كتل PHP.

function evalCallback($matches)
{
    // [0] = <?php return returnOrEcho("hi1");?>
    // [1] = <?php
    // [2] = return returnOrEcho("hi1");
    // [3] = ?>
    return eval($matches[2]);
}

function evalPhp($file)
{
    // Load contents
    $contents = file_get_contents($file);
    // Add returns
    $content_with_returns = str_replace(
                               "returnOrEcho"
                              ,"return returnOrEcho"
                              ,$contents);
    // eval
    $modified_content = preg_replace_callback(
                              array("|(\<\?php)(.*)(\?\>)|"
                             ,"evalCallback"
                             ,$content_with_returns);
    return $modified_content;
}

سيتعين عليك تعديل ملف PHP الذي تقوم بتضمينه لاستخدام ملف returnOrEcho وظيفة بحيث يمكن تحميلها بشكل زائد لهذه الحالة والحالة العادية.في هذه الحالة تريد return حتى يتم التقاطها من قبل eval بالطريقة التي تريدها، ولكن الحالة الطبيعية هي أن echo بدون عودة.

لذلك في هذه الحالة يمكنك تحديد:

function returnOrEcho($str)
{
    return $str;
}

وبالنسبة للحالة العادية ستحدد:

function returnOrEcho($str)
{
    echo $str;
}

في ملف PHP المضمن (أو ملف العرض)، سيكون لديك شيء مثل هذا:

<?php returnOrEcho("hi1");?>
<?php returnOrEcho("hi3"."oo");?>
<?php returnOrEcho(6*7);?>

لم أستطع الحصول على preg_replace_callback رد الاتصال المضمن يعمل لذا استخدمت وظيفة منفصلة، ​​ولكن يوجد مثال لكيفية القيام بذلك: preg_replace_callback() - رد الاتصال داخل مثيل الكائن الحالي.

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