先上拉取市场订单的源码:已经专门加了部分注释,不懂请搭楼咨询,勿要重复盖楼,方便统一回复。
<?php
$mysqli = new mysqli('127.0.0.1', 'root', '', 'new'); //本地数据库连接
set_time_limit(0);
$time = microtime(true);
echo '<pre>开始时间' . date('Y-m-d H:i:s', time()) . '<br>';
$data = [];
$count = 140;//因为网易不返回总页数,实测基本大于总页数,可以了
for ($i=1; $i <$count ; $i++) { //10000002 吉他所在星域,查询其他地域请自行修改
$url = '
https://esi.evepc.163.com/latest/markets/10000002/orders/?datasource=serenity&order_type=all&page='.$i;
$data[]['url'] = $url;//构造esi连接,词链接不需要授权,放心使用
}
function getMultiCurlResult($data = [], $timeout = 120)//CURL异步获取数据,提升数据获取效率
{
$request = [];
$requestResource = curl_multi_init();
foreach ($data as $k => $v) {
$option = [
CURLOPT_TIMEOUT => $timeout,//请求超时时间,防止死循环
CURLOPT_RETURNTRANSFER => true,//获取的信息以文件流的形式返回,而不是直接输出。
];
if (!isset($v['url']) || !$v['url']) return null;
$option[CURLOPT_URL] = trim($v['url']);
if (stripos($v['url'], 'https') === 0) $option[CURLOPT_SSL_VERIFYPEER] = false;
if (isset($v['data'])) {//如果设置了请求参数,则是POST请求
$option[CURLOPT_POST] = true;
$option[CURLOPT_POSTFIELDS] = http_build_query($v['data']);
}
//启动一个curl会话
$request[$k] = curl_init();
//设置请求选项
curl_setopt_array($request[$k], $option);
//添加请求句柄
curl_multi_add_handle($requestResource, $request[$k]);
}
$running = null;
$result = [];
do {//执行批处理句柄
//CURLOPT_RETURNTRANSFER如果为0,这里会直接输出获取到的内容.如果为1,后面可以用curl_multi_getcontent获取内容.
curl_multi_exec($requestResource, $running);
//阻塞直到cURL批处理连接中有活动连接,不加这个会导致CPU负载超过90%.
curl_multi_select($requestResource);
} while ($running > 0);
foreach ($request as $k => $v) {
$result[$k] = curl_multi_getcontent($v);
curl_multi_remove_handle($requestResource, $v);
}
curl_multi_close($requestResource);
return $result;
}
$res = getMultiCurlResult($data);
unset($data);
//数据计算与写入数据库
//print_r($res);
foreach($res as $k => $v)
{
$arr=json_decode($v,true);
//print_r($arr);
foreach($arr as $key => $value)
{
if(@$value['location_id']==60003760)//吉他海4,如获取其他地区请自行更换
{
$price=$value['price'];
if($value['is_buy_order']!=1)
{
if(isset($data[$value['type_id']]['卖单最低价']))
{
if($data[$value['type_id']]['卖单最低价']>$price)
{
$data[$value['type_id']]['卖单最低价']=$price;//卖价卖单最低价
}
}else{
$data[$value['type_id']]['卖单最低价']=$price;
}
}
if($value['is_buy_order']==1)
{
if(isset($data[$value['type_id']]['买单最高价']))
{
if($data[$value['type_id']]['买单最高价']<$price)
{
$data[$value['type_id']]['买单最高价']=$price;//买单买单最高价
}
}else{
$data[$value['type_id']]['买单最高价']=$price;
}
}
}
}
}
$t=time();
foreach($data as $type_id => $value)
{
if(isset($data[$type_id]['卖单最低价']) and isset($data[$type_id]['买单最高价']))
{
$data[$type_id]['利率']=round(($data[$type_id]['卖单最低价']-$data[$type_id]['买单最高价'])*100/$data[$type_id]['买单最高价']).'%';
}else{
if(!isset($data[$type_id]['卖单最低价']))
{
$data[$type_id]['卖单最低价']='';
}
if(!isset($data[$type_id]['买单最高价']))
{
$data[$type_id]['买单最高价']='';
}
$data[$type_id]['利率']='0';
}
//写入数据库
if($data[$type_id]['利率']!='0')
{
$lv=$data[$type_id]['利率'];
$zdj=$data[$type_id]['卖单最低价'];
$zgj=$data[$type_id]['买单最高价'];
$sql="UPDATE eve SET 卖单最低价='$zdj',买单最高价='$zgj',利率='$lv',更新时间戳='$t' WHERE typeID='$type_id'";
//echo $sql.'<br>';
$query=$mysqli->query($sql);
}
}
$cost = microtime(true) - $time;
echo "结束时间" . date('Y-m-d H:i:s', time()) . ', 耗时 '. sprintf('%.5f', $cost) . 's, 平均每个耗时:' . sprintf('%.5f', $cost / $count) . 's <br>';
?>