Hướng dẫn stdin php

Tôi muốn làm một cái gì đó như thế này:

$ [mysql query that produces many lines] | php parse_STDIN.php

Trong parse_STDIN.phptệp, tôi muốn có thể phân tích cú pháp từng dòng dữ liệu của mình từ stdin.

  • php
  • pipe
  • stdin

51 hữu ích 5 bình luận 72k xem chia sẻ

answer

99

Hướng dẫn stdin php

sử dụng STDINhằng số làm trình xử lý tệp.

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

Lưu ý: fgets trên STDIN đọc \nký tự.

99 hữu ích 4 bình luận chia sẻ

answer

16

Bạn cũng có thể sử dụng máy phát điện - nếu bạn không biết STDIN sẽ lớn như thế nào.

Yêu cầu PHP 5> = 5.5.0, PHP 7

Một cái gì đó dọc theo dòng của:

function stdin_stream()
{
    while ($line = fgets(STDIN)) {
        yield $line;
    }
}

foreach (stdin_stream() as $line) {
    // do something with the contents coming in from STDIN
}

Bạn có thể đọc thêm về máy phát điện tại đây (hoặc tìm kiếm hướng dẫn trên google): http://php.net/manual/en/language.generators.overview.php

16 hữu ích 5 bình luận chia sẻ

Đăng nhập để trả lời câu hỏi

Có thể bạn quan tâm

Tôi đang cố gắng viết một tập lệnh PHP sử dụng ứng dụng pdftk để hợp nhất XFDF với một biểu mẫu PDF và xuất tệp PDF đã hợp nhất cho người dùng. Theo tài liệu pdftk, tôi có thể chuyển dữ liệu biểu mẫu vào thông qua stdinvà có đầu ra PDF vào stdoutluồng. Cách thông thường, tệp-không-luồng để sử dụng pdftk từ dòng lệnh là:

pdftk blankform.pdf fill_form formdata.xfdf output filledform.pdf

để sử dụng các luồng trên dòng lệnh, bạn phải nhập:

pdftk blankform.pdf fill_form - output -

Tôi có một số vấn đề:

1) Tôi đã nhận pdftk để trả lại đầu ra stdoutbằng cách sử dụng tệp xfdf (thay vì stdin) như vậy:

    exec("pdftk blankform.pdf fill_form formdata.xfdf output -", $pdf_output);
    file_put_contents("filledform.pdf",$pdf_output);

Nhưng pdf mà nó tạo ra bị hỏng, theo Adobe Reader và việc xem nhanh tệp bằng trình chỉnh sửa văn bản cho thấy rằng, ít nhất, nó không đặt phần cuối của dòng đúng như vậy. Tôi có một tệp PDF giống hệt được tạo bởi pdftk nơi nó xuất ra một tệp và pdf trông ổn trong trình chỉnh sửa văn bản, vì vậy tôi biết rằng không phải pdftk đang xuất ra dữ liệu xấu.

2) Tôi không thể tìm ra cách đặt stdinluồng trong PHP để tôi có thể sử dụng luồng đó làm đầu vào cho pdftk. Từ những gì tôi đang đọc trên tài liệu PHP, stdinlà chỉ đọc, vậy làm cách nào để mọi thứ có thể vào được luồng đó?

Tốt nhất, tôi muốn giữ điều này thực sự đơn giản và tránh sử dụng proc_open(). Tôi đã cố gắng sử dụng chức năng đó và không thành công lắm, đó có thể là lỗi của tôi, không phải của chức năng, nhưng thực sự mục tiêu của tôi đủ đơn giản, tôi muốn tránh sử dụng các chức năng mạnh mẽ mà tôi không cần.

Lý tưởng nhất là mã của tôi sẽ giống như sau:

 $form_data_raw = $_POST;
 $form_data_xfdf = raw2xfdf($form_data_raw); //some function that turns HTML-form data to XFDF

 $blank_pdf_form = "blankform.pdf";

 header('Content-type: application/pdf');
 header('Content-Disposition: attachment; filename="output.pdf"');

 passthru("pdftk $blank_pdf_form fill_form $form_data_xfdf output -);

Chỉ cần lưu ý, có thể đặt chuỗi xml thực tế trong dòng lệnh, nhưng tôi đã có kết quả rất không đáng tin cậy với điều này.

Biên tập

Với nhiều sự trợ giúp, bây giờ tôi hiểu rằng câu hỏi thực sự của tôi là "làm thế nào có thể chuyển một biến đến một dòng lệnh thực thi trong PHP". Rõ ràng proc_open là cách tốt nhất để đi, hoặc ít nhất là đơn giản nhất. Vì tôi mất nhiều thời gian để tìm ra điều này và vì nghiên cứu của tôi trên Google cho thấy những người khác có thể đang gặp khó khăn, tôi sẽ đăng mã đặc biệt phù hợp cho vấn đề của tôi:

$blank_pdf_form = "blankform.pdf";
$cmd = "pdftk $blank_pdf_form fill_form - output -";

$descriptorspec = array(
   0 => array("pipe", "r"),
   1 => array("pipe", "w")
);

$process = proc_open($cmd, $descriptorspec, $pipes);

if (is_resource($process)) {

    //row2xfdf is made-up function that turns HTML-form data to XFDF
    fwrite($pipes[0], raw2xfdf($_POST));
    fclose($pipes[0]);

    $pdf_content = stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    $return_value = proc_close($process);

    header('Content-type: application/pdf');
    header('Content-Disposition: attachment; filename="output.pdf"');
    echo $pdf_content;
}

30 hữu ích 1 bình luận 26k xem chia sẻ