2008-10-21 9 views
10

PHP में, मैं एक चर में एक फ़ाइल को पढ़ना चाहता हूं और आउटपुट बफरिंग के बिना फ़ाइल में PHP को एक ही समय में संसाधित करना चाहता हूं। क्या यह संभव है?PHP में, आउटपुट बफरिंग का उपयोग किये बिना एक चर फ़ाइल में एक PHP फ़ाइल के आउटपुट को कैप्चर करने का कोई तरीका है?

अनिवार्य रूप से मैं ob_start() का उपयोग किए बिना यह पूरा करने में सक्षम होना चाहते:

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

PHP में यह संभव है?

अपडेट: मैं आउटपुट कॉलबैक के भीतर कुछ और जटिल चीजें करना चाहता हूं (जहां आउटपुट बफरिंग की अनुमति नहीं है)।

+0

आउटपुट बफरिंग का उपयोग क्यों न करें? – Greg

उत्तर

25

PHP की एक छोटी सी ज्ञात विशेषता एक वापसी कॉल के साथ एक फ़ंक्शन कॉल जैसी एक आवश्यक/आवश्यक फ़ाइल का इलाज करने में सक्षम है।

उदाहरण के लिए:

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


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

बहुत, बहुत उपयोगी। धन्यवाद। – ppp

+0

वह शानदार है! – LoneWOLFs

+1

यह भी प्रासंगिक है कि शामिल होने से पहले index.php में सेट चर उपलब्ध हैं और मूल्यांकन करते हैं जब आप myinclude.php शामिल करते हैं। जैसा कि मैंने देखा है, – Duncanmoo

9

जो मैं PHP दस्तावेज़ में बता सकता हूं, नहीं। आप आउटपुट बफरिंग से बचना क्यों चाहते हैं?

इस के आसपास जाने का एकमात्र तरीका है या तो कमांड लाइन php क्लाइंट का आह्वान करना या उपलब्ध होने के आधार पर एक कर्ल अनुरोध करना और विशेष आवश्यकताएं क्या हैं।

+0

यह थोड़े से मैं क्या डरता था :(धन्यवाद! –

0

PHP पृष्ठ पर एक कर्ल अनुरोध करें, अनिवार्य रूप से ब्राउज़र होने का नाटक करें।

+0

यह काम नहीं करता है अगर फ़ाइल सार्वजनिक रूप से सुलभ नहीं है। खरगोश द्वारा जवाब देखें ... ('file_get_contents' curl से भी आसान है) –

0

यदि फ़ाइल स्थानीय है, तो आप क्या कर सकते हैं, स्क्रिप्ट को चर के रूप में एक चर में लोड कर रहा है, फिर स्ट्रिंग पर eval चलाएं। फिर आप बाद में अपने सभी सामान कर सकते हैं। अन्यथा, आपको आउटपुट बफरिंग का उपयोग करना होगा।

+0

दुर्भाग्यवश, वह जीता काम नहीं करते क्योंकि eval() PHP कोड का मूल्यांकन करता है जबकि पृष्ठ तक पहुंचने से PHP कोड का मूल्यांकन किया जाएगा यदि यह एक PHP कोड ब्लॉक में है (उदाहरण के लिए ) –

1

जोरी सेब्रेक्ट्स सही है। एक बराबर है और थोड़ा आसान विधि उपलब्ध है अगर PHP स्क्रिप्ट HTTP पहुँचा जा सकता है:

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

यह ध्यान देने योग्य है कि उत्पादन बफरिंग का उपयोग कर संसाधनों पर आसान होगा।

+0

कई सर्वर allow_furl_open को अक्षम करते हैं और यह एक विकल्प नहीं होगा। – dcousineau

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

लेकिन eval पर दस्तावेज़ीकरण की जाँच करें, क्योंकि आप वास्तव में फ़ाइल आप अपने परिणाम वापस बजाय सिर्फ उन्हें गूंज बुला रहे हैं करना होगा:

http://us2.php.net/eval

6

हर किसी के सुझावों को पढ़ने के बाद, एक पढ़ने प्रलेखन, और कुछ चीजों के साथ चारों ओर खेलने की गुच्छा, मैं इस के साथ आया था:

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

यह के रूप में मैं मिल सकता है के रूप में करीब है लेकिन दुर्भाग्य से यह काम नहीं करता है। इसकी कुंजी फ़ाइल की सामग्री से पहले बंद PHP बिट (?>) को शामिल करना है। यह PHP-मूल्यांकन मोड से eval() ले जाएगा और गैर-PHP कोड के रूप में शुरू होने वाली फ़ाइल की सामग्री का इलाज करेगा। फिर यदि फाइल के भीतर PHP कोड ब्लॉक हैं, तो उनका मूल्यांकन PHP के रूप में किया जाएगा। बमर यह है कि यह वैरिएबल में eval'd सामग्री को सहेजता नहीं है, यह सिर्फ पृष्ठ पर आउटपुट करता है।

सभी की मदद के लिए धन्यवाद!

+4

और वास्तव में eval'd फ़ाइल का आउटपुट देता है? जो मैंने http://us.php.net/manual/en/function.eval.php पर पढ़ा है, आपको अभी भी आउटपुट बफरिंग का उपयोग करने की आवश्यकता होगी। – KernelM

+0

डैंग, मुझे लगता है कि आप ठीक है। :( –

+0

@ जोएलेंसीनी ** नहीं **, यदि आप ** file.php ** में 'वापसी' blabla "' का उपयोग करते हैं, तो 'echo eval (...) '...... का उपयोग करें। ......... कृपया, अपना उत्तर संपादित करें। –

-1

हैक चेतावनी! 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; 
} 

आप आप एक returnOrEcho समारोह का उपयोग करने के लिए इतना है कि यह इस मामले और सामान्य मामले के लिए अतिभारित किया जा सकता शामिल कर रहे हैं PHP फ़ाइल को संशोधित करने के लिए होगा। इस मामले में आप 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() - Calback inside current object instance

+0

, आपने एक गंभीर चीज़ को याद किया है, और आपको इसे संशोधित करने की आवश्यकता है। अगर उस फ़ाइल में, कई ** ईसीएचओ ** हैं, तो यह ठीक है, लेकिन यह फ़ंक्शन ** ईसीएचओ ** एस ** रिटर्न ** के साथ बदलता है, इसलिए पहले ** वापसी ** पर स्क्रिप्ट होगी समाप्त हो गया, इसे जारी रखने की बजाय (जैसे यह ** ईसीएचओ ** का उपयोग कर रहा था) –

संबंधित मुद्दे