<?php
//a.php
$ch = curl_init("http://127.0.0.1/b.php");
$ch_arr = array(CURLOPT_TIMEOUT=>2,CURLOPT_RETURNTRANSFER=>1);//2秒超时限制?
curl_setopt_array($ch,$ch_arr);
curl_exec($ch);
curl_close($ch);
echo 234;
?><?php
//b.php
sleep(6);//等待6秒
?>上面的页面测试中,浏览a.php时很快就返回(毫秒级),浏览b.php可以明显看到>6秒才出来。请问curl_exec到底是异步还是同步执行呢?CURLOPT_TIMEOUT参数有什么用?
//a.php
$ch = curl_init("http://127.0.0.1/b.php");
$ch_arr = array(CURLOPT_TIMEOUT=>2,CURLOPT_RETURNTRANSFER=>1);//2秒超时限制?
curl_setopt_array($ch,$ch_arr);
curl_exec($ch);
curl_close($ch);
echo 234;
?><?php
//b.php
sleep(6);//等待6秒
?>上面的页面测试中,浏览a.php时很快就返回(毫秒级),浏览b.php可以明显看到>6秒才出来。请问curl_exec到底是异步还是同步执行呢?CURLOPT_TIMEOUT参数有什么用?
$start = time();//记录下时间
$ch = curl_init("http://127.0.0.1/post.php");
$ch_arr = array(CURLOPT_TIMEOUT=>2,CURLOPT_RETURNTRANSFER=>1);//2秒超时限制?
curl_setopt_array($ch,$ch_arr);
curl_exec($ch);
curl_close($ch);
echo time() - $start;//比对时间,试试,是不是2秒??????毫秒级是错觉吧?
CURLOPT_TIMEOUT是CURL的超时限制,并不是说要让它执行那么多秒。而是说超过那么多秒,即终止,如果不需要那么长时间就能获取到结果,则提前完成(就不在CURLOPT_TIMEOUT限制之内)。
CURLOPT_TIMEOUT是指超时时间,不是说2秒后才完成执行,而是指如果curl_exec()大于2秒还没有执行完成,就不等结果直接返回了。
用你的代码是了,确认是毫秒级的,时间输出是0。我说明下,即使前面的代码,我说的毫秒级,不是感觉到的,而是firebug里显示的“等待时间”。
所以a.php用curl可以获取b.php但是实际上没有内容。你可以将b.php改为:
<?php
echo "first line";
sleep(6);
echo "after 6 second";
?>然后用a.php去取b.php看看返回的内容是什么。
嗯,这样测试对了。还是有两个疑问请教楼上:
1、既然是同步方式执行的话,是否意味着,如果CURLOPT_TIMEOUT指定时间小于被请求页面实际时间的话,将导致被请求脚本不能完全执行呢?比如b.php中需要做一系列数据的操作,会不会导致那些操作不能被执行完?如果这样,那么如何指定异步方式执行?
2、上面的情况似乎是缓存的问题。后来又在b.php不加输出的情况下也会2秒才执行完。假设不是缓存的原因,请问为什么不加输出时,请求页面没有等待足够的时间才返回呢?
就是这样的,,,,,,,不信,你可以试试b.php,sleep(20)后写一个文件
echo "first line";
sleep(6);
$content = "写入的内容";
$fileopen = fopen("testcurl.txt","a+");
fwrite($fileopen,$content);
fclose($fileopen);
echo "after 6 second";
?>结果,测试中从a.php浏览时没有生成文件,只有从b.php浏览时有生成文件
$start = time();//记录下时间
echo 'test';
$ch = curl_init("http://127.0.0.1/b.php");
$ch_arr = array(CURLOPT_TIMEOUT=>3,CURLOPT_RETURNTRANSFER=>1);
curl_setopt_array($ch,$ch_arr);
curl_exec($ch);
curl_close($ch);
echo time() - $start;
exit();
?>
我本地测试,会生成文件的,
http://www.paul-norman.co.uk/2009/06/asynchronous-curl-requests/