问题:如果用户没有登录 或者 是最近会员可享受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->回车,即查看运行代码)