Yii1.0

 

问题:如果用户没有登录 或者 是最近会员可享受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&para2=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 查看文件目录 

Yii1.0_第1张图片

    4、输入 php metal_url_jiaoben.php 回车即可以查看运行结果

    或者(到目录中粘贴php代码 按回车->ctrl+z->回车,即查看运行代码)

 

你可能感兴趣的:(Yii1.0)