我想用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);
}
答案 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)。
请确保您的用例是否确实需要异步请求。