2009-02-16 13 views
44

मुझे पता है कि PHP आमतौर पर वेब विकास के लिए उपयोग किया जाता है, जहां कोई मानक इनपुट नहीं है, लेकिन यदि आप इसका मज़ाकिया वेब-आधारित सम्मेलनों का पालन करते हैं तो PHP सामान्य प्रयोजन स्क्रिप्टिंग भाषा के रूप में उपयोग करने योग्य दावा करता है। मुझे पता है कि PHP stdout (या जिसे आप इसे कॉल करना चाहते हैं) print और echo के साथ प्रिंट करता है, जो कि काफी आसान है, लेकिन मुझे आश्चर्य है कि PHP स्क्रिप्ट को stdin से इनपुट प्राप्त हो सकता है (विशेष रूप से fgetc() के साथ, लेकिन कोई भी इनपुट फ़ंक्शन है अच्छा), या यह भी संभव है?PHP मानक इनपुट?

उत्तर

64

यह संभव php://stdin के लिए एक फ़ाइल हैंडल बनाने के द्वारा stdin को पढ़ने के लिए और फिर उदाहरण के लिए एक लाइन के लिए fgets() साथ इसे से पढ़ (या, आप के रूप में पहले से ही है कहा गया है, fgetc() एकल वर्ण के लिए):

<?php 
$f = fopen('php://stdin', 'r'); 

while($line = fgets($f)) { 
    echo $line; 
} 

fclose($f); 
?> 
+21

तुम भी बजाय इसे मैन्युअल रूप से खोलने की पूर्वनिर्धारित निरंतर STDIN इस्तेमाल कर सकते हैं:

#!/usr/bin/php <?php $pipe = @trim(fgets(STDIN)); // Script was called with an empty stdin // Fail to continue, php warning 

यह व्यवहार php शीर्षक पर stream_set_blocking स्थापित करने से बचा जा सकता $ लाइन = fgets (STDIN); – gix

+2

एसटीडीआईएन मेरे लिए काम नहीं करता था, लेकिन 'php: // stdin', 'r' किया था। Vista पर PHP 5.2.9-2 (क्ली) का उपयोग करना (बनाया गया: 9 अप्रैल 200 9 08:19:19)। –

+0

@EricJ।, अजीब, यह कैसे हुआ? क्या आपने 'STDIN' 'बंद कर दिया था? – Pacerier

8

आप fopen()php://stdin पर उपयोग कर सकते हैं:

$f = fopen('php://stdin', 'r'); 
5

IIRC, आप निम्न का उपयोग भी कर सकते हैं:

$in = fopen(STDIN, "r"); 
$out = fopen(STDOUT, "w"); 

तकनीकी रूप से वही, लेकिन थोड़ा क्लीनर वाक्यविन्यास-वार।

+1

यह एक टिप्पणी –

36

से पढ़ना STDINrecommended way

<?php 
while (FALSE !== ($line = fgets(STDIN))) { 
    echo $line; 
} 
?> 
12

है filehandles के साथ चारों ओर गंदगी के लिए होने से बचने के लिए, का उपयोग file_get_contents() और php://stdin:

$ echo 'Hello, World!' | php -r 'echo file_get_contents("php://stdin");' 
Hello, World! 

(आप में से एक सही मायने में बड़ी राशि पढ़ रहे हैं stdin से डेटा आप फ़ाइलहेडल दृष्टिकोण का उपयोग करना चाहेंगे, लेकिन यह कई मेगाबाइट्स के लिए अच्छा होना चाहिए।)

+1

'file_get_contents' होनी चाहिए .... फ़ाइल की गड़बड़ी के रूप में एक बड़ी समस्या देगी। – Pacerier

11

एक सरल विधि एक शॉट में

$var = trim(fgets(STDIN)); 
+2

इसके अलावा हम '$ सामग्री = file_get_contents (" php: // input ") का उपयोग कर सकते हैं;' –

5

ले लो यह सब है:

$contents = file_get_contents("php://stdin"); 
echo $contents; 
2

यह भी काम करता है:

$data = stream_get_contents(STDIN); 
0

fgets का उपयोग करते समय पार्टी लिपियों में ब्लॉक कर सकते हैं, यदि stdin@php error control operator का उपयोग करते समय सेट या खाली नहीं है।

#!/usr/bin/php 
<?php 
stream_set_blocking(STDIN, 0); 
$pipe = @trim(fgets(STDIN)); 
// Script was called with an empty stdin 
// No errors or warnings, continue 
संबंधित मुद्दे