【问题标题】:PHP: Pass file into script as stdinPHP:将文件作为标准输入传递给脚本
【发布时间】:2016-10-29 00:34:07
【问题描述】:

我正在尝试为我正在构建但无法启动的电子邮件解析器编写一些测试。

对于正常操作,电子邮件将通过管道传输到脚本,但对于测试,我想模拟管道操作:)

我的测试是这样开始的:

#!/opt/php70/bin/php
<?php

define('INC_ROOT', dirname(__DIR__));

$script = INC_ROOT . '/app/email_parser.php';

//$email = file_get_contents(INC_ROOT . '/tests/test_emails/test.email');
$email = INC_ROOT . '/tests/test_emails/test.email';

passthru("{$script}<<<{$email}");

使用原样的脚本,传递给标准输入的唯一内容是测试电子邮件的路径。当使用 file_get_contents 我得到:

sh: -c: line 0: syntax error near unexpected token '('
sh: -c: line 0: /myscriptpath/app/email_parser.php<<<TestEmailContents

其中 TestEmailContents 是原始电子邮件文件的内容。我觉得我过去曾以这种方式执行脚本,使用 heredoc 运算符将数据传递到标准输入。但是在过去的几天里,我一直找不到任何信息来帮助我克服这个绊脚石。任何建议都会非常感激!

【问题讨论】:

  • 执行脚本时似乎不需要使用heredoc运算符(

标签: php pipe stdin php-7


【解决方案1】:

遇到的语法错误正是如此。要获取文件内容并将其作为此处的字符串传递,我需要对字符串进行单引号:

$email = file_get_contents(INC_ROOT . '/tests/test_emails/test.email');

passthru("{$script} <<< '{$email}'");

但是,在我的情况下,传递原始电子邮件不需要使用此处的字符串。无论哪种方式都保留行尾。将文件重定向到脚本产生了相同的结果。

$email = INC_ROOT . '/tests/test_emails/test.email';

passthru("{$script} < {$email}");

【讨论】:

  • 非常有趣。找到你的线程,因为我需要做同样的事情。我有一个解析传入电子邮件的脚本,它工作正常 - 我不想碰它。但是,我想编写另一个脚本,该脚本从某个收件箱中读取所有文件,并将每个文件/电子邮件传递给解析脚本以浏览所有过去的电子邮件(在解析脚本实施之前进入)。我知道这已经过时了,但您还有最终解决方案的机会吗?
  • 我使用了上述两种方法,在这两种情况下,处理的原始电子邮件在 50% 的时间里都做得很干净,另外 50% 的时候我遇到了与您的 OP 类似的错误。有人建议做base64_encode(file_get_contents('emailFile')) 并且消除了所有错误,但是它也导致了我的解析脚本失败的问题,将 STDIN 分解为单独的行 - 而不是每封电子邮件要循环 200 多行,现在每封电子邮件都是两行,并且结果什么都没有被捕获。
  • 更正!你的第二个,passthru("{$script} &lt; {$email}") ; 工作得很好,结果我的$email 有一个错字。
【解决方案2】:

要在 PHP 中读取标准输入,您可以使用 php://stdin 文件名:$content = file_get_contents('php://stdin');$f = fopen('php://stdin', 'r');

要将字符串传递给调用的进程,您有两个选择:popenproc_openpopen 函数更容易使用,但它的用途有限。 proc_open 有点复杂,但可以让您更好地控制 stdio 重定向。

这两个函数都为您提供了可以使用fwritefread 的文件句柄。在您的情况下,popen 应该足够好(简化):

$f = popen('./script.php', 'w');
fwrite($f, file_get_contents('test.email'));
pclose($f);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-15
    • 2017-12-07
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多