سؤال

أعرف أن 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 "!"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top