使用http请求的PHP后台同步

使用http请求的PHP后台同步,php,multithreading,curl,multitasking,Php,Multithreading,Curl,Multitasking,我有一个php代码,假设每2分钟同步数千个http链接的数据,并更新数据库 然而,有些网站速度太慢,我目前的方法是使用foreach并逐个浏览链接,大约需要15分钟 有没有更好的方法在更短的时间内完成这项任务 foreach($email as $emails) { imap_open(......); // update db } 谢谢没有示例代码,很难给出建议。但是,您可能正在使用一种连接方法,该方法在收到响应之前会“阻塞”。这意味着PHP将停止,直到该请求一次完成一个请求为止 您需

我有一个php代码,假设每2分钟同步数千个http链接的数据,并更新数据库

然而,有些网站速度太慢,我目前的方法是使用foreach并逐个浏览链接,大约需要15分钟

有没有更好的方法在更短的时间内完成这项任务

foreach($email as $emails) {

imap_open(......);

// update db

}

谢谢

没有示例代码,很难给出建议。但是,您可能正在使用一种连接方法,该方法在收到响应之前会“阻塞”。这意味着PHP将停止,直到该请求一次完成一个请求为止

您需要的是一次连接到多个系统并轮询响应

如果在写入http请求头之前在套接字上设置stream_set_blocking(),则fsockopen()可以做到这一点。那么弗雷德可以

另一种解决方案是将PHP分成多个进程,每个进程请求不同的源代码


这足以为你指明正确的方向吗?如果没有,请提供一些示例代码,以便我们知道您当前使用的方法,并且有人可以扩展它以满足您的需要。

是的,并行执行

一种解决方案是将当前的URL列表跨越20个线程。您还没有向我们展示您的代码,但想象一下它目前的功能如下:

$urls=mysqli_query($link,
      "SELECT url FROM list");
while ($r=mysqli_fetch_assoc($urls)) {
    ...
您可以尝试以下方法来分割数据集:

$instance=(integer)$argv[1];
if (0==$instance) {
    die("Next time start me with a number between 1 and 20 indicating the thread");
}
$urls=mysqli_query($link,
      "SELECT url FROM list WHERE $instance-1 = CONVERT(
         CONV(SUBSTR(MD5(url),4), 16, 10) USING SIGNED INTEGER)
       ) % 20
      ");

或者,您可以在一个PHP线程中批处理HTTP请求,并使用
curl\u multi\u init()
或RollingCurl()调用它们。对于一些请求,我使用imap\u open。我想我们需要更多地解释为什么要使用imap来同步电子邮件,对于一个本地dbc,代码由foreach内部的curl和imap_open函数组成,我将用一个示例更新答案。imap_open似乎不支持流设置阻塞。太好了,所以对于imap_open请求。你是否考虑过分岔这个过程。这将为每次查找创建一个新的php线程,而不会延迟扫描。一个非常基本的示例如下:
foreach($targets as$target){
如果($pid<0){
die('cannot fork');
}如果($pid){/code>
<我们是家长,继续前进;
}否则{
//我们是孩子,发出远程请求并退出
exit();
}
实际上,你可能需要一个速率限制机制和更多反馈