Hướng dẫn php stdin - php tiêu chuẩn

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ẻ 5 bình luận 72k xem chia sẻ

answer

99

Hướng dẫn php stdin - php tiêu chuẩn

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

while($f = fgets(STDIN)){
    echo "line: $f";
}
0ký tự.

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

answer

16

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

Lưu ý: fgets trên STDIN đọc

while($f = fgets(STDIN)){
    echo "line: $f";
}
0ký tự.

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

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ũ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 5 bình luận chia sẻ

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

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ẻ

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

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

pdftk blankform.pdf fill_form - output -

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

while($f = fgets(STDIN)){
    echo "line: $f";
}
1và có đầu ra PDF vào
while($f = fgets(STDIN)){
    echo "line: $f";
}
2luồng. Cách thông thường, tệp-không-luồng để sử dụng pdftk từ dòng lệnh là:

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

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

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

1) Tôi đã nhận pdftk để trả lại đầu ra

while($f = fgets(STDIN)){
    echo "line: $f";
}
2bằng cách sử dụng tệp xfdf (thay vì
while($f = fgets(STDIN)){
    echo "line: $f";
}
1) như vậy:

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.

 $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 -);

2) Tôi không thể tìm ra cách đặt

while($f = fgets(STDIN)){
    echo "line: $f";
}
1luồ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,
while($f = fgets(STDIN)){
    echo "line: $f";
}
1là chỉ đọc, vậy làm cách nào để mọi thứ có thể vào được luồng đó?rất không đáng tin cậy với điều này.

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 while($f = fgets(STDIN)){ echo "line: $f"; } 7. 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:

$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;
}

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. 1 bình luận 26k xem chia sẻ