我需要加速以下代码的simple_xml_file部分。
我在思考多线程......有什么想法吗?
如何加速获取xml文件的代码部分。
<?php
$k = $_GET['key'];
echo "<ul id=\"List\">\n";
foreach ($feed as $url2):
$title=$url2['name'];
$url=$url2['url'];
if (strpos($url, $key)==true) {
//Load XML
$temp = simplexml_load_file("http://api.site.com/web?uri=$url"); //Need to speed this
//Echo
echo "<li>".$temp->filter->filterResponse->filteredText."</li>";
}else{
//URL Contains Nothing Check Title
if(strpos($title,$key)==true)
{
$temp = simplexml_load_file("http://api.site.com/web?uri=$url"); //Need to speed this
//Echo
echo "<li>".$temp->filter->filterResponse->filteredText."</li>";
}
}
endforeach;
echo "</ul>";
?>
答案 0 :(得分:1)
PHP不支持多线程,所以你无能为力 BTW。我认为加入这两个条件会更加清晰,因为你无论如何都要执行相同的操作:
if (strpos($url, $key) == true OR strpos($title,$key) == true) {
//Load XML
$temp = simplexml_load_file("http://api.site.com/web?uri=$url"); //Need to speed this
//Echo
echo "<li>".$temp->filter->filterResponse->filteredText."</li>";
}
答案 1 :(得分:1)
您可以让API服务器的http请求与curl并行运行,如下所示:
//create the multiple cURL handle
$mh = curl_multi_init();
// gather curl handlers into an array for later use and add them to the multi request
$requests = array();
foreach ($feed as $url2) {
$url=$url2['url'];
$title=$url2['name'];
// strpos can return 0 which will evaluate to false even if the needle is in fact in the beginning of the haystack
if (strpos($url, $key) !== false || strpos($title,$key) !== false) {
$ch = curl_init("http://api.site.com/web?uri=".$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_multi_add_handle($mh, $ch);
$requests[] = $ch;
}
}
// execute the requests
$running=null;
do {
// exec the multy request, update the $running variable
while (CURLM_CALL_MULTI_PERFORM === curl_multi_exec($mh, $running));
// break the loop if we are done
if (!$running) {
break;
}
// block until something interesting happens on a request
while (($res = curl_multi_select($mh)) === 0);
// if its an error, do something about it!
if ($res === false) {
// handle select errors here!
break;
}
// repeat forever (or until we break out)
} while (true);
// loop trough the results
foreach ($requests as $ch) {
// load resposne
$xml = simplexml_load_string(curl_multi_getcontent($ch));
// do your original processing
echo "<li>".$xml->filter->filterResponse->filteredText."</li>";
// clean up curl handler
curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);
如果没有真正的数据(除语法之外),我无法真正测试这个,但你明白了。
您对strpos()
的使用看起来很奇怪,如果针头在大海捞针的开头但是0
评估为假,它可能会重新0 == true
(数字为零),我不确定如果这是你想要的。