2009-08-31 13 views
6

मैं कुछ फ़ाइलों को ऑफ़लाइन बनाने के लिए कमांड लाइन PHP का उपयोग कर रहा हूं। स्क्रिप्ट उत्पादन मैं मानक ob_start सामान का उपयोग पर कब्जा करने के लिए:सीएलआई PHP स्क्रिप्ट्स में आउटपुट बफरिंग का उपयोग करते समय टर्मिनल पर प्रिंटिंग

ob_start(); 
// Echo lots of stuff 
$content = ob_get_contents(); 
// Now the $content can be written to a file 

हालांकि, मैं भी (उदाहरण के लिए, चेतावनी) टर्मिनल के लिए कुछ संदेश मुद्रित करने के लिए जबकि बफर में "मुख्य उत्पादन" एकत्रित चाहते हैं। क्या इसे करने का कोई तरीका है? टर्मिनल संदेशों को मुद्रित करने के लिए थोड़ी देर के लिए बफरिंग को रोकना संभव नहीं लगता है, और उसके बाद बफरिंग जारी रखें जहां से यह छोड़ा गया था। क्या इसके समाधान की कोई युक्ति है?

उत्तर

8

बस STDOUT या STDERR को लिखने (दोनों स्थिरांक फ़ाइल सूचक संसाधनों से युक्त) fputs का उपयोग():

ob_start(); 
echo 'Output buffer'; 
fputs(STDOUT, "Log message"); 
$x = ob_get_contents(); 
ob_end_clean();; 

echo "X = $x"; 
5

php://stderr धारा का उपयोग करें:

$f = fopen('php://stderr', 'w'); 
fputs($f, 'Output'); 

संपादित करें: इसके अलावा, CLI में, वहाँ है एक predefined STDERR constant:

fputs(STDERR, 'Output'); 
2

आउटपुट बफर को 'रोकें' संभव है। बफर की सामग्री को एक चर में लिखें, और बिना बफर किए बफर को समाप्त करें। कुछ गैर-buffered आउटपुट लिखें, और ob_start() फिर से कॉल करें। यह विधि स्ट्रिंग कॉन्सटेनेशन का उपयोग करती है, और यह अपेक्षाकृत गंदे विधि है। मैं इस कारण से अपने स्वयं के अन्य तरीकों को पसंद करता हूं।

<?php 
ob_start(); 
    echo 'Buffered line 1.<br>'; 
$ob = ob_get_contents(); 
ob_end_clean(); 

echo 'Non-buffered line.<br>'; 

ob_start(); 
    echo 'Buffered line 2.<br>'; 
$ob .= ob_get_contents(); 
ob_end_clean(); 

echo 'Non-buffered line.<br>'; 

ob_start(); 
    echo 'Buffered line 3.<br>'; 
$ob .= ob_get_contents(); 
ob_end_clean(); 

echo 'Non-buffered line.<br>'; 

echo $ob; 
?> 
:

लेकिन दोनों ही मामलों में, यहाँ एक छोटा सा, काम उदाहरण है

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