سؤال
أعرف أن PHP يستخدم عادة لتطوير الويب، حيث يوجد يكون لا توجد إدخال قياسي، لكن PHP يدعي أن تكون قابلة للاستخدام ككلغة نصية للأغراض العامة، إذا قمت باتباع الاتفاقيات المستندة إلى الويب غير تقليدي. أعلم أن PHP يطبع stdout
(أو ما تريد أن تسميه) print
و echo
, ، وهو بسيط بما فيه الكفاية، لكنني أتساءل كيف قد يحصل البرنامج النصي PHP على إدخال من stdin
(على وجه التحديد مع fgetc()
, ، ولكن أي وظيفة الإدخال جيدة)، أم أن هذا ممكن؟
المحلول
من الممكن قراءة stdin
عن طريق إنشاء مقبض ملف ل php://stdin
ثم قرأت منه fgets()
للحصول على خط على سبيل المثال (أو، كما ذكرت بالفعل، fgetc()
لشخصية واحدة):
<?php
$f = fopen( 'php://stdin', 'r' );
while( $line = fgets( $f ) ) {
echo $line;
}
fclose( $f );
?>
نصائح أخرى
قراءة من ستوتن يكون طريقة الموصى بها
<?php
while (FALSE !== ($line = fgets(STDIN))) {
echo $line;
}
?>
لتجنب الاضطرار إلى الفوضى مع filehandles، واستخدام file_get_contents()
و php://stdin
:
$ echo 'Hello, World!' | php -r 'echo file_get_contents("php://stdin");'
Hello, World!
(إذا كنت تقرأ كمية هائلة حقا من البيانات من stdin
قد ترغب في استخدام نهج Filehandle، ولكن يجب أن يكون هذا جيدا للعديد من ميغابايت.)
طريقة بسيطة هي
$var = trim(fgets(STDIN));
يمكنك استخدام fopen()
على php://stdin
:
$f = fopen('php://stdin', 'r');
الاستيلاء على كل شيء في طلقة واحدة:
$contents = file_get_contents("php://stdin");
echo $contents;
IIRC، قد تستخدم أيضا ما يلي:
$in = fopen(STDIN, "r");
$out = fopen(STDOUT, "w");
من الناحية الفنية، ولكن بناء الجملة منظف قليلا.
هذا يعمل أيضا:
$data = stream_get_contents(STDIN);
عند استخدام FGETS، قد يحظر ذلك في البرامج النصية BASH، إذا كان stdin
لم يتم تعيين أو فارغة، بما في ذلك أثناء استخدام @
PHP خطأ التحكم في المشغل.
#!/usr/bin/php
<?php
$pipe = @trim(fgets(STDIN));
// Script was called with an empty stdin
// Fail to continue, php warning
يمكن تجنب هذا السلوك عن طريق الإعداد stream_set_blocking
على رأس php:
#!/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
echo $pipe . "!";
كمثال، أن يسمى على النحو التالي:
echo "Hello world" | ./myPHPscript
// Output "Hello world!"
./myPHPscript
// Output "!"