post item
2018年12月17日 16:10:51

PHP杂项

Galgame_News


~~


http://php.net/features.commandline    commend cli  

https://overtrue.me/articles/2014/10/php-chinese-to-pinyin.html    汉语转拼音

https://laravel-china.org/docs/psr/psr-2-coding-style-guide/1606   PSR-N

https://implode.io/?mode=plain  Online PHP To Laravel!

http://www.dooccn.com/php7  Online PHP!

http://php.net/manual/zh/book.swoole.php     Swoole


https://github.com/alibaba/RedisFullCheck    redis对比不同 | 两个Redis实例怎么快速对比哪些数据不一致


https://laravel-china.org/docs/psr/psr-2-coding-style-guide/1606    PSR-控制结构规范



function newOnlyKeys($array, $keys) {
    // array_intersect_key 使用键名比较计算数组的交集 r    然后再用array_flip筛选出制定数据
    return array_intersect_key($array, array_flip($keys));
    // return array_diff_key 这个是返回移除指定键名的函数
    // return array_diff_key($array, array_flip($keys));
}
var_dump(newOnlyKeys($raw, ['id', 'name']));



public static function download($path, $file) {
$real = $path . '/' . $file;
if(!file_exists($real)) {
    return false;
}
    $size = filesize($real);
    $size2 = $size-1;
    $range = 0;
    if(isset($_SERVER['HTTP_RANGE'])) {
    //http_range表示请求一个实体/文件的一个部分,用这个实现多线程下载和断点续传!
    header('HTTP /1.1 206 Partial Content');
    $range = str_replace('=','-',$_SERVER['HTTP_RANGE']);
    $range = explode('-',$range);
    $range = trim($range[1]);
  header('Content-Length:'.$size);
  header('Content-Range: bytes '.$range.'-'.$size2.'/'.$size);
} else {
  header('Content-Length:'.$size);
  header('Content-Range: bytes 0-'.$size2.'/'.$size);
}
header('Accenpt-Ranges: bytes');
header('application/octet-stream');
header("Cache-control: public");
header("Pragma: public");
//解决在IE中下载时中文乱码问题
$ua = $_SERVER['HTTP_USER_AGENT'];
if (preg_match('/MSIE/',$ua)) {
  //表示正在使用 Internet Explorer。
  $ie_filename = str_replace('+','%20',urlencode($file));
  header('Content-Dispositon:attachment; filename='.$ie_filename);
} else {
  header('Content-Dispositon:attachment; filename='.$file);
}
$fp = fopen($real,'rb+');
  fseek($fp,$range);            //fseek:在打开的文件中定位,该函数把文件指针从当前位置向前或向后移动到新的位置,新位置从文件头开始以字节数度量。成功则返回 0;否则返回 -1。注意,移动到 EOF 之后的位置不会产生错误。
  while(!feof($fp)) {           //feof:检测是否已到达文件末尾 (eof)
  set_time_limit(0);        //注释①
  print(fread($fp,1024));   //读取文件(可安全用于二进制文件,第二个参数:规定要读取的最大字节数)
  ob_flush();               //刷新PHP自身的缓冲区
  flush();                  //刷新缓冲区的内容(严格来讲, 这个只有在PHP做为apache的Module(handler或者filter)安装的时候, 才有实际作用. 它是刷新WebServer(可以认为特指apache)的缓冲区.)
}
  fclose($fp);
}


// php获取真实IP
public function getIp()
{
    $ip = '';        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    $ip_arr = explode(',', $ip);
    return $ip_arr[0];
}



// http请求
class HttpSend extends Controller
{

    const CONNECT_TIMEOUT = 20;
    const READ_TIMEOUT = 120;
    const HTTP_GET = 'GET';
    const HTTP_POST = 'POST';
    const HTTP_DELETE = 'DELETE';
    const HTTP_PUT = 'PUT';
    
    public static function get($url) {
        $response = self::sendRequest($url, self::HTTP_GET, $body=null);
        return $response;
    }
    public static function post($url, $body) {
        $response = self::sendRequest($url, self::HTTP_POST, $body);
        return $response;
    }
    public static function put($url, $body) {
        $response = self::sendRequest($url, self::HTTP_PUT, $body);
        return $response;
    }
    public static function delete($url) {
        $response = self::sendRequest($url, self::HTTP_DELETE, $body=null);
        return $response;
    }

    private static function sendRequest($url, $method, $body=null, $times=1) {
        // Write Log
        if (!defined('CURL_HTTP_VERSION_2_0')) {
            define('CURL_HTTP_VERSION_2_0', 3);
        }
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, true);
        // curl_setopt($ch, CURLOPT_USERAGENT, self::USER_AGENT);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, self::CONNECT_TIMEOUT);  // 连接建立最长耗时
        curl_setopt($ch, CURLOPT_TIMEOUT, self::READ_TIMEOUT);  // 请求最长耗时
        // 设置SSL版本 1=CURL_SSLVERSION_TLSv1, 不指定使用默认值,curl会自动获取需要使用的CURL版本
        // curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        // 如果报证书相关失败,可以考虑取消注释掉该行,强制指定证书版本
        //curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');
        // 设置Basic认证
        curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
        // curl_setopt($ch, CURLOPT_USERPWD, '');
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);

        // 设置Post参数
        if ($method === self::HTTP_POST) {
            curl_setopt($ch, CURLOPT_POST, true);
        } else if ($method === self::HTTP_DELETE || $method === self::HTTP_PUT) {
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
        }
        if (!is_null($body)) {
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
        }

        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Content-Type: application/json',
            'Connection: Keep-Alive'
        ));

        $output = curl_exec($ch);
        $response = array();
        $errorCode = curl_errno($ch);

        // $msg = '';
        // $data = json_decode($body, true);
        // if (isset($data['options']['sendno'])) {
        //     $sendno = $data['options']['sendno'];
        //     $msg = 'sendno: ' . $sendno;
        // }

        $msg = '';
        if (isset($body['options']['sendno'])) {
            $sendno = $body['options']['sendno'];
            $msg = 'sendno: ' . $sendno;
        }


        if ($errorCode) {
            if ($errorCode === 28) {
                throw new \Exception($msg . "Response timeout. Your request has probably be received by JPush Server,please check that whether need to be pushed again." );
            } elseif ($errorCode === 56) {
            // resolve error[56 Problem (2) in the Chunked-Encoded data]
                throw new \Exception($msg . "Response timeout, maybe cause by old CURL version. Your request has probably be received by JPush Server, please check that whether need to be pushed again.");
            } else {
                throw new \Exception("$msg . Connect timeout. Please retry later. Error:" . $errorCode . " " . curl_error($ch));
            }
        } else {
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
            $header_text = substr($output, 0, $header_size);
            $body = substr($output, $header_size);
            $headers = array();
            foreach (explode("\r\n", $header_text) as $i => $line) {
                if (!empty($line)) {
                    if ($i === 0) {
                        $headers[0] = $line;
                    } else if (strpos($line, ": ")) {
                        list ($key, $value) = explode(': ', $line);
                        $headers[$key] = $value;
                    }
                }
            }
            $response['headers'] = $headers;
            $response['body'] = $body;
            $response['http_code'] = $httpCode;
        }
        curl_close($ch);
        return $response;
    }


    
}



 发布者!!

Comments

Leave a comment

Loading