【问题标题】:Handle HTTP POST with PHP使用 PHP 处理 HTTP POST
【发布时间】:2010-10-07 05:42:20
【问题描述】:

我挣扎了半天,得出的结论是做不到。我扔掉了我的 php 脚本并用 perl 重写了它,它从一开始就按照我想要的方式工作。不过,我想知道这样的琐碎任务是否可以在 PHP 中正确完成。 问题:我有任意长(大小和时间)的文件上传(通过原始数据 POST),我只需要使用 PHP 将其保存到文件中。它与 PHP 一起工作的方式是它首先完全处理发布的数据,将其保存到文件中,然后开始执行我的脚本(我的文件上传持续 30 分钟)。即使我尝试 fopen("php:/stdin" 或 php://input) 它仍然以迟钝的方式工作。我真正需要的是能够按顺序处理传入的发布数据。我试过:1) modphp,2) php-cgi,3) php-cli 作为 cgi 可执行文件运行。即使 php-cgi 打算用作 cgi,它仍然会预处理发布的数据(以便 $_POST 可用)并且与常规 momphp 的工作方式不同。 CLI 版本作为 cgi 脚本运行不起作用,因为它根本无法从 php://stdin 或 php://input 读取!无论我尝试了什么,都没有任何效果,我得出的结论是 PHP 无法做到......或者它可以?

谢谢

【问题讨论】:

    标签: php apache http post cgi


    【解决方案1】:

    当然 PHP 可以做到。上传的文件存储在一个临时目录中,直到 PHP 脚本可以与它们交互。这样做所需的信息在 $_FILES 数组中。

    $field_name = 'file'; # from the HTML form control
    
    $move_result = move_uploaded_file(
        $_FILES[$field_name]['tmp_name'],
        $real_destfile
    );
    
    if ($move_result) {
        print "successfully uploaded file (originally called '$_FILES[$field_name]['name']' to $real_destfile";
    } else {
        print "failed to receive uploaded file.";
    }
    

    【讨论】:

    • 这不是 OP 所要求的。他想在漫长的上传过程完成之前访问文件/运行他的脚本。
    【解决方案2】:

    听起来您想要流式传输数据。为此,您必须设置一个准备好将数据作为流接收的套接字。即替换 apache Web 服务器。

    您的问题不是语言,而是网络服务器。 Web 服务器侦听端口 80,然后执行它的工作。例如,将发布数据写入文件,然后启动 php 脚本。

    您可以像使用 Pearl 一样创建自定义端口程序。你也可以用 PHP 做同样的事情,并使用命令行驱动的 php 脚本来监听端口 80,而不是使用 apache 中的脚本。但是 PHP 并不是最好的语言。我建议使用 Python。

    HTTP 通信会产生额外开销,或许更精简的协议对您有用,它可能会减少您的上传时间。

    如果您的上传时间过长,您可以使用 AJAX 方法进行上传,并在您的客户端应用程序仍处于活动状态时继续上传。客户端 AJAX 应用程序也可以将其分成块。

    【讨论】:

    • 是的,我正在传输数据。我不想使用 $_FILES 的原因是它不适用于 BIG 和 LONG 上传(到服务器的流式传输看起来像 PHP)。命令行 PHP 是有史以来最糟糕的主意,说真的,我不敢相信它有多糟糕!我真的很喜欢 php,但是当我尝试在 CLI 模式下使用它时,我意识到它是一堆废话:它抛出了太多错误,而且我看不到任何日志。我最终写了一个 perl cgi 脚本。比打开socket要好:apache调用cgi脚本,把所有socket处理交给cgi程序处理。
    • 我根本不懂 Python,所以这不是我的解决方案。我找到了如何做到这一点(通过 cgi-perl),并且我知道所有 tcp-listeners 的方法,但我真的想知道是否可以通过处理原始输入/发布数据来使用 php 来完成。有 php://input 有点没用,这可能会让一些人相信它允许直接访问输入流。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2016-04-06
    • 2021-12-14
    • 2011-07-10
    • 1970-01-01
    • 2016-10-26
    相关资源
    最近更新 更多