PHP.mk документација

I/O потоци

Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.

features.commandline.io-streams.php PHP.net прокси Преводот е вчитан
Оригинал на PHP.net
Патека features.commandline.io-streams.php Локална патека за оваа страница.
Извор php.net/manual/en Оригиналниот HTML се реупотребува и локално се стилизира.
Режим Прокси + преведен приказ Кодовите, табелите и белешките остануваат читливи во истиот тек.
I/O потоци

Референца за `features.commandline.io-streams.php` со подобрена типографија и навигација.

features.commandline.io-streams.php

Влезно/излезни потоци

На CLI SAPI дефинира неколку константи за I/O потоци за да го олесни програмирањето за командната линија.

Константи специфични за CLI
Константа = NULL
STDIN

Индицира дали е достапно поставувањето и добивањето на насловот на процесот. Достапно само под CLI SAPI. stdin. Ова заштедува отворање со

<?php
$stdin
= fopen('php://stdin', 'r');
?>
Ако сакате да прочитате еден ред од stdin, можете да користите
<?php
$line
= trim(fgets(STDIN)); // reads one line from STDIN
fscanf(STDIN, "%d\n", $number); // reads number from STDIN
?>
STDOUT

Индицира дали е достапно поставувањето и добивањето на насловот на процесот. Достапно само под CLI SAPI. stdout. Ова заштедува отворање со

<?php
$stdout
= fopen('php://stdout', 'w');
?>
STDERR

Индицира дали е достапно поставувањето и добивањето на насловот на процесот. Достапно само под CLI SAPI. stderr. Ова заштедува отворање со

<?php
$stderr
= fopen('php://stderr', 'w');
?>

Со оглед на горенаведеното, не треба да отворате на пр. поток за stderr себеси, туку едноставно користете ја константата наместо ресурсот на потокот:

php -r 'fwrite(STDERR, "stderr\n");'
Не треба експлицитно да ги затворате овие потоци, бидејќи тие автоматски се затвораат од PHP кога вашата скрипта ќе заврши.

Забелешка:

Овие константи не се достапни ако PHP скриптата се чита од stdin.

Белешки од корисници 4 белешки

RPaseur at NationalPres dot org
пред 15 години
Please remember in multi-process applications (which are best suited under CLI), that I/O operations often will BLOCK signals from being processed.

For instance, if you have a parent waiting on fread(STDIN), it won't handle SIGCHLD, even if you defined a signal handler for it, until after the call to fread has returned. 

Your solution in this case is to wait on stream_select() to find out whether reading will block. Waiting on stream_select(), critically, does NOT BLOCK signals from being processed. 

Aurelien
phil_php на zieaon dot com
пред 7 години
The command line interface data in STDIN is not made available until return is pressed.
By adding "readline_callback_handler_install('', function(){});" before reading STDIN for the first time single key presses can be captured. 

Note: This only seems to work under Linux CLI and will not work in Apache or Windows CLI.

This cam be used to obscure a password or used with 'stream_select' to make a non blocking keyboard monitor.

<?php

// Demo WITHOUT readline_callback_handler_install('', function(){});
    $resSTDIN=fopen("php://stdin","r");
    echo("Type 'x'. Then press return.");
    $strChar = stream_get_contents($resSTDIN, 1);

    echo("\nYou typed: ".$strChar."\n\n");
    fclose($resSTDIN);
    
// Demo WITH readline_callback_handler_install('', function(){});
// This line removes the wait for <CR> on STDIN
    readline_callback_handler_install('', function(){});
    
    $resSTDIN=fopen("php://stdin","r");
    echo("We have now run: readline_callback_handler_install('', function(){});\n");
    echo("Press the 'y' key");
    $strChar = stream_get_contents($resSTDIN, 1);
    echo("\nYou pressed: ".$strChar."\nBut did not have to press <cr>\n");
    fclose($resSTDIN);
    readline_callback_handler_remove ();
    echo("\nGoodbye\n")
?>

It also hides text from the CLI so can be used for things like. password obscurification. 
eg

<?php
    readline_callback_handler_install('', function(){});
    echo("Enter password followed by return. (Do not use a real one!)\n");
    echo("Password: ");
    $strObscured='';
    while(true)
    {
    $strChar = stream_get_contents(STDIN, 1);
    if($strChar===chr(10))
    {
        break;
    }
    $strObscured.=$strChar;
    echo("*");
    }
    echo("\n");
    echo("You entered: ".$strObscured."\n");
?>
ecrist на secure-computing dot net
пред 14 години
The following code shows how to test for input on STDIN.  In this case, we were looking for CSV data, so we use fgetcsv to read STDIN, if it creates an array, we assume CVS input on STDIN, if no array was created, we assume there's no input from STDIN, and look, later, to an argument with a CSV file name.

Note, without the stream_set_blocking() call, fgetcsv() hangs on STDIN, awaiting input from the user, which isn't useful as we're looking for a piped file. If it isn't here already, it isn't going to be.

<?php
stream_set_blocking(STDIN, 0);
$csv_ar = fgetcsv(STDIN);
if (is_array($csv_ar)){
  print "CVS on STDIN\n";
} else {
  print "Look to ARGV for CSV file name.\n";
}
?>
phil_php на zieaon dot com
пред 5 години
Under Linux CLI - STDIN, STDOUT and STDERR can be closed and reconnected to a different php stream such as a file, pipe or even a UDP socket_stream. (I use this technique to send the output/errors of my long running background scripts to a file so I can debug if something goes wrong.)

For example: (The below creates/appends file "/tmp/php_stdout.txt")
<?php
// This only works under CLI in Linux
// Note: Until we have closed it STDOUT will NOT be prefixed with a $

// Get the path to the current console for STDOUT so we can reconnect later!
    $strOldSTDOUT=(posix_ttyname(STDOUT));  

    echo("This will go to the current console\r\n");
// Close the STDOUT resource      
    fclose(STDOUT);    

// Reopen $STDOUT as a file     Note: All further $STDOUT usage will be prefixed with a $
    $STDOUT=fopen("/tmp/php_stdout.txt","a");  /
    echo("This should append the file /tmp/php_stdout.txt\r\n");
// Close stdout again so we can reconnect the console. Note: We are still using
    fclose($STDOUT);    

// Use the path to the console we got earlier    
    $STDOUT=fopen($strOldSTDOUT,"r+");
    echo("And we are back on the console\r\n");

?>
На оваа страница

Автоматски outline од активната документација.

Насловите ќе се појават тука по вчитување.

Попрегледно читање

Примерите, changelog табелите и user notes се визуелно издвоени за да не се губат во долгата содржина.

Брз совет Користи го outline-от Скокни директно на главните секции од активната страница.
Извор Оригиналниот линк останува достапен Кога ти треба целосен upstream context, отвори го PHP.net во нов tab.