【问题标题】:POST variables without waiting for the execution of the end side scriptPOST 变量而不等待端脚本的执行
【发布时间】:2015-04-29 09:35:38
【问题描述】:

我有这种情况...
我正在使用 CURL 将一些变量发布到远程主机。您可以在下面看到我的 PHP 脚本的样子:
本地 PHP 脚本:

$url = 'http://somesite.com/something.php';
data = array ('key1' => 'string1',
          'key2' => 'string2',
          'key3' => 'string3');
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $data);
curl_exec ($ch);
curl_close ($ch);
// Some code to do other stuff.

远程 PHP 脚本:

$string1 = $_POST['key1'];
// If this string exists in a very big folder of text files.
sleep(30);
// Do something with the file that contain the string.

我的问题是本地 php 脚本正在加载,直到远程脚本完成执行。我的问题是,有没有办法将这些变量发布到该远程主机,然后继续执行脚本?不强制使用 CURL,但我想要一个 PHP 解决方案。谢谢!

【问题讨论】:

  • PHP 默认不是这样工作的。您必须研究进程分叉或使用另一种服务器端语言,如 node.js,它是异步的
  • 分叉过程的一个例子:CURL 请求一个页面,该页面执行一些操作并输出结果,该页面分叉自身以继续执行其他操作,该页面停止执行,分叉的进程在后台无人看管,直到完成
  • 好的,我想我的问题没有正确提出。我的意思是,有没有办法将这些变量发布到该远程主机,然后继续执行脚本?不强制使用 CURL,但我想要一个 PHP 解决方案。我现在也会更新我的问题。谢谢!
  • Here's an answer 这正是我所指的。

标签: php curl


【解决方案1】:

为您的代码添加超时:

curl_setopt($ch, CURLOPT_TIMEOUT, 1);

这将在 1 秒后继续执行代码的其余部分。

CURLOPT_TIMEOUT 允许 cURL 函数的最大秒数 执行。

或者你可以使用它几毫秒:

CURLOPT_TIMEOUT_MS 允许 cURL 的最大毫秒数 要执行的功能。如果构建 libcurl 以使用标准系统 名称解析器,连接的那部分仍将使用整秒 解决超时问题,允许的最小超时时间为一秒。

您可以从here阅读更多解释。

一旦其他脚本启动,它将继续执行,无需等待完成输出。

【讨论】:

  • 我不确定在 StackOverFlow 上如何投票,因为这是我第一次使用它,但我没有拒绝你的回答。也许是别人。我会试试你的解决方案,我会回来提供反馈。
  • 我认为对 downvote 的解释(我没有投)是 curl 操作将在 1 秒后中止/终止。它不会使 curl 调用异步,它仍会等待一秒钟并终止操作。 curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html
  • @Ejay 是的,但原始代码正在等待 30 秒。在许多情况下,1 秒的等待时间是可以接受的,并且有一个选项 TIMEOUT_MS 可以减少等待时间。
  • @Ejay 请注意我修改了我的帖子。我实际上不需要脚本立即继续(1-2 秒就可以了),但你说得对,我不想中止请求(至少在我的变量发布之前)。无论如何,我没有在生产环境中使用它,所以我会赞成座右铭的答案,因为他的答案实际上是在做我需要的,至少现在是这样。我期待着更好的解决方案,并附上示例。谢谢大家!
  • @motto 我试图对你的答案投赞成票,但看来我需要至少 15 名声望...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 2011-02-05
相关资源
最近更新 更多