标签:
问题:如果用户没有登录 或者 是最近会员可享受7天会员的价格都已做了缓存。但是,由于是老用户根据用户的权限不同获取产品价格点就不同,因此访问数据库的速度很慢很慢。。。。
目前解决方案:当有用户登录访问产品时,即将该用户的访问的产品做缓存,如果某会员也拥有同样的权限,调用缓存即可;
然而问题来了,第一次访问权限的时候特别慢,其实速度勉强正常;
目前解决方案:通过php脚本自动跑程序,找一个拥有最高权限的用户来跑缓存(将所有产品都做了缓存1小时跑一次)。
代码如下:
通过 php脚本 调用 控制器中的方法跑程序中的代码;
<?php
ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行.
set_time_limit(0);// 通过set_time_limit(0)可以让程序无限制的执行下去
//定义参数
$arr=array(
‘copper‘,
‘aluminum‘,
‘lead‘,
‘nickel‘,
‘zinc‘,
‘tin‘,
‘rare-earth‘,
‘minor-metals‘,
‘precious-metals‘,
‘scrap-and-secondary-copper‘,
);
$power=array(
‘date‘=>date(‘Y-m-d‘, strtotime("-3 month")),
‘state‘=>1,
‘power‘=>array(
‘201308090006‘,‘201102250311‘,‘201101102250180‘,‘201102250136‘, //产品权限
),
);
foreach ($arr as $category){
$power[‘category‘][0]=$category;
$url = "http://testmet.com/autologininfo/auto";
$content = api_post_data($url,http_build_query($power));
echo $category.$content;
echo ‘<br>‘;
}
function api_post_data($url,$data=‘‘)
{
try {
$ch = curl_init();
$timeout = 3000;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$handles = curl_exec($ch);
curl_close($ch);
} catch (\Exception $ex) {
curl_close($ch);
}
return $handles;
}
控制器中的代码
<?php
/*
* 说明:php脚本调用该方法
* 参数:$_POST;(实际上就是用户的$power+$category数组的集合)
* 时间:2015-12-24
*/
class AutologinController extends Controller{
/*
* php脚本调用该方法
*/
public function actionAuto(){
/*判断是否有数据提交*/
if(!isset($_POST) && empty($_POST)){
echo ‘Sorry,I Dont find data,return false!‘;
}
/*Metal调用数据的核心方法*/
$info= MetalsComponent::getDataListinfo($_POST,$_POST[‘category‘][0]);
/*返回的是一个数组,说明调用成功有返回数据*/
if(is_array($info)){
echo $category.‘-------------------‘;
}else{
echo ‘<NO>‘;
}
}
}
总结:
速度貌似没提高多少,从中学习到的东西归纳一下;
(1)学习如果使用 CURL post传递数据
注意:当通过curl post 传递数据时 会调用如下代码
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$data 默认的是一维数组 和字符串,然而我需要传递的是一个二维数组,因此在测试的过程中遇到了500的错误
百度收索了一下发现也有人出现同样的错误 http://blog.csdn.net/fableboy/article/details/18973483
PHP的CURL组件是非常常用的HTTP请求模拟器。 通常要发送post数据时,我已经习惯于这样写: curl_setopt( $ch, CURLOPT_POSTFIELDS,$post_data); 但是在向某一个服务器发送请求的时候,服务器返回500。而使用socket方式连接上去发送请求,返回正常的数据。 尝试发送到一个仅有<?php print_r($_SERVER);?>的网页上,可以看到使用数组发送POST数据时,收到的CONTENT_TYPE如下: [CONTENT_TYPE] => multipart/form-data; boundary=—————————-f924413ea122 而使用http_build_query($post_data),收到的CONTENT_TYPE如下: [CONTENT_TYPE] => application/x-www-form-urlencoded 可见,当CURLOPT_POSTFIELDS被设置为数组时,HTTP头会发送Content_type: application/x-www-form-urlencoded。这个是正常的网页<form>提交表单时,浏览器发送的头部。而multipart/form-data我们知道这是用于上传文件的表单。包括了boundary分界符,会多出很多字节。 手册上提到: The full data to post in a HTTP “POST” operation. To post a file, prepend a filename with @ and use the full path. This can either be passed as a urlencoded string like ‘para1=val1¶2=val2&…’ or as an array with the field name as key and field data as value. If value is an array, the Content-Type header will be set to multipart/form-data. 使用数组提供post数据时,CURL组件大概是为了兼容@filename这种上传文件的写法,默认把content_type设为了multipart/form-data。虽然对于大多数web服务器并没有影响,但是还是有少部分服务器不兼容。 本文得出的结论是,在没有需要上传文件的情况下,尽量对post提交的数据进行http_build_query,然后发送出去,能实现更好的兼容性,更小的请求数据包。
(2)通过命令行测试代码
1、首先已经设置好了环境变量
2、打开cmd 找到你的盘
3、找到php脚本文件 dir 查看文件目录

4、输入 php metal_url_jiaoben.php 回车即可以查看运行结果
或者(到目录中粘贴php代码 按回车->ctrl+z->回车,即查看运行代码)
标签:
原文地址:http://www.cnblogs.com/lccjob/p/5073278.html