【php】curl代理html file (分块)上传文件

Continue Read..

我目前要用php做个代理层

html file 上传的文件  我要直接获取文件流

然后吧文件流分块传出去

 

首先了解下 php的上传流程

php内置函数 $_FILES $_POST 在调用这2个函数的时候 会自动解析 php://input

而且php内核也会先处理 php://input  然后把流解析并生成到缓存文件里面

如果流呗读取过,那么这个流就不能再次读取,所以需要在php没有读取文件流之前 把文件流读取到

有2个方法

1.写一个php的C扩展 取代$_FILES  

2.修改php.ini (如果你的服务器只有一个程序,可以修改,不然就会影响其他程序)

    2.1 nginx.conf 

        proxy_request_buffering off;

        fastcgi_request_buffering off;

    2.2  php.ini

       memory_limit = 8M (忘记这个要不要改了)

       file_uploads = Off

       upload_max_filesize = 0M

       post_max_size = 0M


然后就可以直接获取流


 

    function actionImg4(){

        $fp = fopen("php://input", "r");

        $wfp = fopen("/data/1.png",'w+');

        while(!feof($fp)){

            $buffer = fread($fp,1000);

            fwrite($wfp, $buffer);

        }

    fclose($wfp);

    fclose($fp);

    }

    

    //前端上传文件时 调用这个接口

    function actionImg5(){

        $url = "http://xxxx.com/api/cuzntest/img4";  //接收方

        $fopen = fopen ("php://input", "r");

    $size = $_SERVER['HTTP_CONTENT_LENGTH']; //获取流大小

    $x = $this->curlUpload1($url,$fopen,$size);

    fclose($fopen);

    var_dump($x);

    }

    

    

    function curlUpload1($url,$fd,$size){

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);

        curl_setopt($ch, CURLOPT_HEADER, false);

        curl_setopt($ch, CURLOPT_PUT, true);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/binary","Expect:") );

        curl_setopt($ch, CURLOPT_READFUNCTION,

            function ($ch, $fd, $length) {

                $data = fread($fd, 1000);

//                 file_put_contents('/data/1.txt', $data.'------------------------',FILE_APPEND);

                $len = strlen($data);

                return $data;

            }

   );

    curl_setopt($ch, CURLOPT_HTTPHEADER, array(

    'Accept: */*',

    'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',

    'Connection: Keep-Alive'));

        curl_setopt($ch, CURLOPT_INFILE, $fd);

        curl_setopt($ch, CURLOPT_INFILESIZE, $size);

        $ret['tmpInfo'] = curl_exec($ch);

    $ret['error_code'] = curl_errno($ch);

        $ret['error_msg'] = curl_error($ch);

        $ret['getinfo'] = curl_getinfo($ch);

        curl_close($ch);

        return $ret;

    }


用postman 测试是 需要改 Content-Type  multipart/form-data  ->  x-multipart/form-data


跳转到代理下载文章


声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

crontab 唯一执行与超时

Continue Read..

参考:http://huoding.com/2016/12/12/573

唯一执行

假如上一分钟的 A 请求还没退出,下一分钟的 B 请求也启动了,那么 B 请求会发现 A 请求还没有释放锁,于是它不会执行。

flock -xn /tmp/lock /path/to/php /path/to/file

 

带超时的唯一执行

假如上一分钟的 A 请求还没退出,下一分钟的 B 请求也启动了,那么 B 请求会发现 A 的请求还没有释放锁,于是它不会执行,不过下下分钟的 C 请求肯定能执行,因为在这之前,A 请求已经因为超时被 timeout 干掉了

timeout -s SIGINT 100 flock -xn /tmp/lock /path/to/php /path/to/file

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

js 获取url?后面的参数、当前路径

Continue Read..
一种:
调用:
var merchantCardId=getParameter("parkRecordId");

方法
function getParameter(name) { 
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)"); 
var r = window.location.search.substr(1).match(reg); 
if (r!=null) return unescape(r[2]); return null;
}

二种:
调用:
if (!utils.getQueryStringByName("qid")) {
    this.$dispatch("alert.show", "您所查看的问题无效");
    logger.error("问题无效");
}if (utils.getQueryStringByName("enter") == "100") {
    this.shareShow = false;
}this.questionid = utils.getQueryStringByName("qid");
方法
getQueryStringByName: function (name) {
    var result = location.search.match(new RegExp("[\?\&]" + name + "=([^\&]+)", "i"));
    if (result == null || result.length < 1) {
        return "";
    }
    return result[1];
},
 
 
getCurrentPath: function (opts) {
    var rtn = document.location.hash;
    if (opts && opts.pathOnly) {
        rtn = rtn.split('?')[0].replace(/#!\//g, '');
    }
    return rtn;
},

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

【Yii2】behaviors 控制器访问前和访问后的操作

Continue Read..
最近要做个控制机访问的日志功能,而且还要记录访问的返回值,又不想在每个控制器里面加代码,这时就用了   

新建一个php文件

<?php
namespace common\models;
use Yii;
use yii\base\ActionFilter;
use cpbackend\controllers\AgencyController;
class TestFilter extends ActionFilter {
    //在action之前运行,可用来过滤输入
    public function beforeAction($action) {
        return TRUE;//如果返回值为false,则action不会运行
    }
    //在action之后运行,可用来过滤输出
    public function afterAction($action, $result) {
        //获取控制器的对象属性
        $logArr['xx'] = empty($action->controller->_user['adminInfo']) ? 0 : $action->controller->_user['adminInfo']['xx'];
        //获取访问的控制器名称 比如  a/b
        $logArr['requste'] = json_encode(Yii::$app->requestedRoute);
        //获取请求的参数
        if(!empty($action->controller->actionParams)){
            $logArr['data'] = json_encode($action->controller->actionParams);
        }
        if(!empty(Yii::$app->getRequest()->getRawBody())){
            $logArr['data'] = Yii::$app->getRequest()->getRawBody();
        }
        //获取请求类型
        $logArr['type'] = "";
        if(yii::$app->request->isGet){
            $logArr['type'] = "GET";
        }
        if(yii::$app->request->isPost){
            $logArr['type'] = "POST";
        }
        //这里获取返回的值  
        if(!$this->is_json($result)){
            $result = json_encode($result);
        }
        $logArr['return'] = $result;
        AgencyController::createlog($logArr);
        return $result; 
    }
    function is_json($string) { 
        return (json_last_error() == JSON_ERROR_NONE);
    }
}



然后各个控制器里面加上
 public function behaviors()
    {
        return [
            'access' => [
                'class' => 'common\models\TestFilter',
                // 'only' => ['index'],   //这里是能访问的控制器
                // 'except' => ['getlist'],   //这里是不能访问的控制
            ],
        ];
    }


特别要注意 每个控制器比如是return xxx;结尾 并且不能die掉
感谢老外童鞋的帮助~~~~

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

培训相关:一行代码加边线,找标签

Continue Read..

点击查看原图

页面所有元素加上边线

$$("*").forEach(function(value){value.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16)});

 

点击查看原图

页面上所用的标签数量:["HTML", "HEAD", "META", "TITLE", "LINK", "SCRIPT", "BODY", "DIV", "H1", "A", "SPAN", "FORM", "INPUT", "UL", "LI", "H2", "P", "IMG", "PRE", "BR", "TABLE", "TBODY", "TR", "TD", "CODE", "EM", "H3"]

$$("*").map(function(value){return(value.tagName)}).reduce(function(arr,item){if(arr.indexOf(item)===-1)arr.push(item);return arr},[]).length;

 

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

css 步骤引导页面

Continue Read..

 1.

点击查看原图

html:

<div class="odContent">
    <ul class="tpinfo">
        <li class="active">
            <p>退票申请</p>
            <p>2016-11-2 08:45</p>
        </li>
        <li>
            <p>退票受理中</p>
            <p>2016-11-2 08:45</p>
        </li>
        <li>
            <p>退票完成</p>
            <p>2016-11-2 08:45</p>
        </li>
    </ul>
</div>
css:
.odContent .tpinfo{
    overflow: hidden;
    counter-reset:step;
}
.odContent .tpinfo li{
    width: 20%;
    text-align: center;
    clear:none;
    border-top:none;
    list-style-type: none;
    text-transform: uppercase;
    float: left;
    position: relative;
}
.odContent .tpinfo li:before {
    content: counter(step);
    counter-increment: step;
    width: 20px;
    line-height: 20px;
    display: block;
    font-size: 10px;
    color: #fff;
    background: #E8E8E8;
    border-radius: 3px;
    margin: 0 auto 5px auto;
}
/*progressbar connectors*/
.odContent .tpinfo li:after {
    content: '';
    width: 100%;
    height: 2px;
    background: #E8E8E8;
    position: absolute;
    left: -50%;
    top: 18px;
    z-index: -1; /*put it behind the numbers*/
}
.odContent .tpinfo li:first-child:after {
    /*connector not needed before the first step*/
    content: none;
}
/*marking active/completed steps green*/
/*The number of the step and the connector before it = green*/
.odContent .tpinfo li.active:before,  .odContent .tpinfo li.active:after{
    background: #0099FF;
    color: white;
}
.odContent .tpinfo li p{
    line-height:20px;
    font-size:14px;

}

2.

点击查看原图

html:

<div class="odContent">
                            <ul class="tpinfo">
                                <li class="box">
                                    <span class="big blue"><b class="small blue-inner"></b></span>
                                    <span class="step">退票申请</span>
                                    <span class="time">2016-11-02 08:45</span>
                                </li>
                                <hr class="line1 line-blue"/>
                                <li class="box middle">
                                    <span class="big blue"><b class="small blue-inner"></b></span>
                                    <span class="step">退票受理中</span>
                                    <span class="time">2016-11-02 08:50</span>
                                </li>
                                <hr class="line2 line-gray"/>
                                <li class="box">
                                    <span class="big gray"><b class="small gray-inner"></b></span>
                                    <span class="step">退票完成</span>
                                    <span class="time">2016-11-02 21:45</span>
                                </li>
                            </ul>
                        </div>
css:
.odContent .tpinfo{
    position: relative;
    height: 95px;
    /*border-bottom: 1px solid #DDDEE3;*/
    /*border-top: 1px solid #DDDEE3;*/
    /*background: #fff;*/
    box-sizing: border-box;
    margin-left:30px;
}
.odContent .tpinfo li{
    /*width: 20%;*/
    float:left;
    text-align:center;
    clear:none;
    border-top:none;
}
.odContent .tpinfo li .big {
    margin-top: 15px;
    display: inline-block;
    vertical-align: middle;
    width: 23px;
    height: 23px;
    line-height: 23px;
    border-radius: 50%;
    text-align: center; }
.odContent .tpinfo li .big .small {
    display: inline-block;
    vertical-align: middle;
    width: 9px;
    height: 9px;
    border-radius: 50%; }
.odContent .tpinfo li .gray {
    background: rgba(149, 152, 159, 0.2); }
.odContent .tpinfo li .gray .gray-inner {
    background: rgba(149, 152, 159, 0.9); }
.odContent .tpinfo li .blue {
    background: rgba(51, 149, 255, 0.2); }
.odContent .tpinfo li .blue .blue-inner {
    background: rgba(51, 149, 255, 0.6);
}
.odContent .tpinfo li .step {
    display: block;
    margin-top: 10px;
    font-size: 12px;
    color: #777E8C; }
.odContent .tpinfo li .time {
    display: block;
    margin-top: 10px;
    font-size: 10px;
    color: #777E8C; }
.odContent .tpinfo .middle {
    margin-left: 43px;
    margin-right: 44px; }
.odContent .tpinfo .line1 {
    width: 74px;
    border-top: 1px solid #DDDEE3;
    position: absolute;
    top: 35px;
    left:80px; }
.odContent .tpinfo .line2 {
    width: 74px;
    border-top: 1px solid #DDDEE3;
    position: absolute;
    top: 35px;
    left:227px; }
.odContent .tpinfo .line-blue {
    /*background: #3395FF; */
    border-top: 1px solid #3395FF;
}
.odContent .tpinfo .line-gray {
    /*background: #DDDEE3;*/
    border-top: 1px solid #DDDEE3;
}

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权