Php异步请求进行循环

时间:2018-08-16 09:36:05

标签: php

我想用PHP发出1500个异步请求。我尝试了以下代码,但想知道它是否异步?用PHP发出异步请求的正确方法是什么

function test($url){

    $data = file_get_contents($url);
    if(!empty($data)){
        echo "Success";
    }
    else{
        echo "Fail";
    }
}
for ($i=0; $i < 1500; $i++ ) { 
    $data = 'https://example.com';
    test($data);
}

3 个答案:

答案 0 :(得分:1)

不,这是同步的。一次会发生1个请求。

执行异步HTTP的最简单方法是请求它使用支持它的HTTP库或curl_multi_*函数。

答案 1 :(得分:1)

file_get_contents不是异步请求。这是一个“阻止”请求。在失败或失败之前,您都不会越过该行。

在php中发出异步请求的一种方法是使用操作系统的功能来分叉进程。另一种方法是使用套接字(并在不等待响应的情况下写入套接字)。第三是使用pthreads。这些都是“技巧”,根本不是真正的异步,但是pthreads和fork将很好地模拟异步请求。以下代码使用fork技术。

<?php
private function request($url, $payload) {
  $cmd = "curl -X POST -H 'Content-Type: application/json'";
  $cmd.= " -d '" . $payload . "' " . "'" . $url . "'";
  if (!$this->debug()) {
    $cmd .= " > /dev/null 2>&1 &";
  }
  exec($cmd, $output, $exit);
  return $exit == 0;
}
?>

此代码摘自有关该主题的精彩文章,可在此处找到:

https://segment.com/blog/how-to-make-async-requests-in-php/

本文的作者没有讨论线程,但是派生该过程只是使用OS为您创建线程,而不是在代码中完成。 (有点...。)

答案 2 :(得分:0)

PHP默认不提供异步执行。

因此您的代码无法发送异步请求。上面的代码示例将一个接一个地发送1500个请求。在发出所有请求之前,它将保持进程暂停。

您可以为此目的尝试使用pthread(http://php.net/manual/en/book.pthreads.php)或多卷曲(http://php.net/manual/en/function.curl-multi-init.php)。

请确保您的用例是否确实需要异步请求。