【问题标题】:HttpSendRequest not waiting for PHP script to finishHttpSendRequest 不等待 PHP 脚本完成
【发布时间】:2011-05-22 06:52:51
【问题描述】:

我正在从我的 C++ 应用程序向服务器上的 PHP 脚本发送 HTTP POST request。使用HttpOpenRequest/HttpSendRequest/etc。目前它等待 PHP 脚本在HttpSendRequest 返回之前完成执行。有没有办法改变这个功能?

我在我的 C++ 应用程序关闭之前发送数据,所以我不希望它在那里等待 10 多秒等待 PHP 脚本完成执行。我只是想让它发送数据,然后关闭应用程序。

我在想的一件事是让 PHP 脚本使用 exec 命令在不同的进程中生成另一个 PHP 脚本,这样第一个脚本会立即返回。但是,我通过 HTTP POST 请求发送了大量数据,因此需要将这些数据传递给生成的进程。

理想情况下,我只想设置一个标志来告诉HttpSendRequest 不要等待。我在文档中看不到任何明显的东西,但可能遗漏了一些东西。

【问题讨论】:

    标签: php c++ wininet


    【解决方案1】:

    您可能希望在您的 PHP 脚本中使用ignore_user_abort()。然后你可以在数据发送后关闭你的 C 客户端的连接,PHP 将继续做它应该做的任何事情。

    【讨论】:

    • 问题在于阻塞的是 HttpSendRequest。所以在该函数返回之前我无法关闭连接。
    • 但它只会在收到响应之前阻塞,对吧? php.net/manual/en/features.connection-handling.php#71172
    • 啊哈!您发布的链接中的代码是我想要的以及 ignore_user_abort() 调用。 header("Connection: close") 加上 ob_* 函数让我提前关闭连接。可能值得使用此信息更新您的帖子,以防其他人遇到此问题。谢谢:-)
    【解决方案2】:

    您可以使用INTERNET_FLAG_ASYNC 调用InternetOpen,并且您的回调不会产生任何影响。

    这里有一些示例代码可以帮助您入门:

    http://www.codeproject.com/KB/IP/asyncwininet.aspx

    然后(正如 rik 建议的那样),在 PHP 脚本的顶部调用 ignore_user_abort(true); 以确保它完全执行。

    ignore_user_abort

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多